java数据库编程——事务
【0】README
1) 本文部分文字描述轉自 core java volume 2 , 測試源代碼均為原創, 旨在理解 java數據庫編程——事務 的基礎知識 ;
2)for database connection config, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/database.properties
【1】事務相關
1)事務定義:將一組語句構建成一個事務;
- 1.1)當所有語句被順利執行后, 事務可以提交;否則,如果其中某個語句遇到錯誤,那么事務將被回滾,就好像沒有任何語句執行過一樣;
- 1.2)將多個語句組合成事務的原因: 為了確保數據庫完整性;(干貨——將多個語句組合成事務的原因)
2)自動提交模式: 默認情況下, 數據庫連接處于 自動提交模式, 每個 sql 語句一旦被執行便被提交給 數據庫, 一旦命令被提交, 就無法對它進行 回滾操作;(干貨——sql語句的執行(execute)與提交(commit)是兩個概念)
- 2.1)在使用事務時, 需要關閉這個默認值;
conn.setAutoCommit(false); - 2.2)現在可以使用通常的方法創建一個語句對象:
Statement stat = conn.createStatement(); - 2.3)然后任意多次調用executeUpdate 方法:
stat.executeUpdate(comman1); - 2.4)如果執行了所有命令之后沒有出錯,則調用 commit 方法:
conn.commit(); - 2.5)如果出錯,則調用
conn.rollback(); //回滾操作
【2】保存點
1)保存點作用: 創建一個保存點意味著稍后只需要返回這個點,而非事務的開頭; (干貨——保存點作用)
2)看個荔枝:
Statement stat = conn.createStatement();//創建語句
stat.executeUpdate(command1);
Savepoint point = conn.setSavepoint();//創建保存點
stat.executeUpdate(command1);
if(…)
conn.rollback(point); //回滾操作
…
conn.commit();
- 2.1)當不再需要保存點 的時候, 必須釋放它; (干貨——釋放保存點)
conn.releaseSavepoint(point);
【3】批量更新
1)批量更新的作用: 一個程序需要執行多條insert 語句, 可以使用批量更新方法來提高程序性能; (干貨——批量更新的作用: 一個程序需要執行多條insert 語句)
Attention)
- A1)使用 DatabaseMetaData 接口中的 supportsBatchUpdates 方法可以獲知數據庫是否支持這種特性;
- A2)處于同一批的語句可以是, insert, update, delete等 DML操作, 也可以是數據庫定義語句, 如create, drop 等DDL;
- A3) 但是, 在批量處理中添加 select 語句會拋出異常(從概念上講, 批量處理中的 select 語句沒有意義, 因為它會返回結果集, 而并不更新數據庫) (干貨——在批量處理中添加 select 語句會拋出異常)
2)使用批量更新的步驟:
- step1)創建一個 Statement對象:
Statement stat = conn.createStatement(); - step2) 應該調用 addBatch 方法, 而不是 executeUpdate 方法:
String command = “create table …. “;
stat.addBatch(command); step3)循環提交 insert 語句:
while(…)
{
command = “insert into …”;
stat.addBatch(command);
}step4)最后 , 提交整個批量更新語句;
int[] counts = stat.executeBatch();
Attention)
- A1)調用executeBatch 方法將為所有已提交的語句返回一個 記錄數的數目;
- A2)為了在批量模式下正確地處理錯誤, 必須將批量執行的操作視為單個事務。 如果批量更新在執行過程中失敗, 那么必須將它回滾到批量操作開始之前的狀態;
A3)首先關閉自動提交模式, 然后收集批量操作, 執行并提交該操作, 最后恢復最初 的自動提交模式:
step1)關閉自動提交模式:
boolean autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
Statement stat = conn.getStatement();
…step2)然后收集批量操作:
// keep calling stat.addBatch();- step3)執行并提交該操作;
stat.executeBatch();
stat.commit(); - step4)最后恢復最初 的自動提交模式;
conn.setAutoCommit(autoCommit);
3)看個荔枝(利用批量更新添加兩行記錄,且添加前設置保存點):
- 3.1)for souce code, please visit : https://github.com/pacosonTang/core-java-volume/blob/master/coreJavaAdvanced/chapter4/SavePointsTest.java
- 3.2)key source code at a glance:
- 3.3)relative printing results as follows:
4)看個荔枝(一個回滾的荔枝):
- 4.1)for souce code, please visit : 同上;
- 4.2)key source code at a glance: 同上;
- 4.3)relative printing results as follows:
【4】高級SQL類型
1) sql 數據類型及其對應的java類型(圖片地址:http://www.cnblogs.com/shishm/archive/2012/01/30/2332142.html)
2)SQL ARRAY(SQL 數組)指的是值的序列;
- 2.1)如, Student 表中通常都會有一個 Scores 列, 這個列就應該是 ARRAY OF INTEGER(整數數組);
- 2.2)getArray方法: 返回一個接口類型為 java.sql.Array 的對象,該接口中有許多方法可以用于獲取數組的值;
3)從數據庫中獲得一個 LOB 或數組并不等于獲取了它的實際內容, 只有在訪問具體值的時候, 它們才會從 數據庫中被讀取出來;
4)ROWID值: 某些數據庫支持描述行位置的 ROWID值, 這樣就可以非常快捷地獲取某一行值;
- 4.1)JDBC 4 引入了 java.sql.RowId 接口: 并提供了用于在查詢中提供 行 ID, 以及從結果中獲取該值的方法;
5)國家屬性字符串(NCHAR及其變體): 按照本地字符編碼機制存儲字符串,并使用本地排序慣例對這些字符串進行排序;
- 5.1) JDBC 4 提供了這種方法, 用于在查詢和結果中進行 java 的 string 對象和國家屬性字符串之間的雙向轉換;
6)有些數據庫提供了用于XML 數據的本地存儲。
- 6.1)JDBC 4 引入了 SQLXML接口: 它可以在內部的 XML 表示和 DOM 的 Source/Result 接口或二進制流之間起到中間作用。
總結
以上是生活随笔為你收集整理的java数据库编程——事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迅雷会员支付电脑网页版(迅雷会员微信支付
- 下一篇: 彩云小译苹果电脑版(彩云小译有电脑版吗)