批量處理允許您將相關的sql語句分組到批處理中,並通過對資料庫的一次呼叫提交它們。
當一次向資料庫傳送多個sql語句時,可以減少連線資料庫的開銷,從而提高效能。
以下是使用語句物件的批處理的典型步驟序列
// create statement object
statement stmt = conn.createstatement();
// set auto-commit to false
conn.setautocommit(false);
// create sql statement
string sql = "insert into employees (id, first, last, age) " +
"values(200,'zia', 'ali', 30)";
// add above sql statement in the batch.
stmt.addbatch(sql);
// create one more sql statement
string sql = "insert into employees (id, first, last, age) " +
"values(201,'raj', 'kumar', 35)";
// add above sql statement in the batch.
stmt.addbatch(sql);
// create one more sql statement
string sql = "update employees set age = 35 " +
"where id = 100";
// add above sql statement in the batch.
stmt.addbatch(sql);
// create an int to hold returned values
int count = stmt.executebatch();
conn.commit();
使用佔位符建立sql語句。
使用preparestatement() 方法建立preparestatement物件。
使用setautocommit()將auto-commit設定為false 。
使用addbatch()方法在建立的語句物件上新增您喜歡的sql語句到批處理中。
在建立的語句物件上使用executebatch()方法執行所有sql語句。
最後,使用commit()方法提交所有更改。
// create sql statement
string sql = "insert into employees (id, first, last, age) " +
"values(?, ?, ?, ?)";
// create preparestatement object
preparedstatemen pstmt = conn.preparestatement(sql);
//set auto-commit to false
conn.setautocommit(false);
// set the variables
pstmt.setint( 1, 400 );
pstmt.setstring( 3, "singh" );
pstmt.setint( 4, 33 );
// add it to the batch
pstmt.addbatch();
// set the variables
pstmt.setint( 1, 401 );
pstmt.setstring( 2, "pawan" );
pstmt.setstring( 3, "singh" );
pstmt.setint( 4, 31 );
// add it to the batch
pstmt.addbatch();
//add more batches
//create an int to hold returned values
int count = stmt.executebatch();
conn.commit();
一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。
事務的四大特點(acid)
表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗
表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態
事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視中間狀態的資料。
永續性事務完成之後,它對於系統的影響是永久性的。
sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。
read uncommitted(讀取未提交內容)
在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read)。
read committed(讀取提交內容)
這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。這種隔離級別也支援所謂的不可重複讀(nonrepeatable read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。
repeatable read可重讀
這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另乙個棘手的問題:幻讀(phantom read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。
serializable可序列化 這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
這四種隔離級別採取不同的鎖型別來實現,若讀取的是同乙個資料的話,就容易發生問題。
例如:
髒讀(drity read):某個事務已更新乙份資料,另乙個事務在此時讀取了同乙份資料,由於某些原因,前乙個rollback了操作,則後乙個事務所讀取的資料就會是不正確的。
不可重複讀(non-repeatableread):在乙個事務的兩次查詢之中資料不一致,這可能是兩次查詢過程中間插入了乙個事務更新的原有的資料。
幻讀(phantom read):在乙個事務的兩次查詢中資料筆數不一致,例如有乙個事務查詢了幾列(row)資料,而另乙個事務卻在此時插入了新的幾列資料,先前的事務在接下來的查詢中,就會發現有幾列資料是它先前所沒有的
mysql中事物的控制:begin;執行sql;出錯了 rollback;沒有出錯: commit;
如果jdbc連線處於自動提交模式,預設情況下,則每個sql語句在完成後都會提交到資料庫。
事務使您能夠控制是否和何時更改應用於資料庫。它將單個sql語句或一組sql語句視為乙個邏輯單元,如果任何語句失敗,則整個事務將失敗。
要啟用手動事務支援,而不是jdbc驅動程式預設使用的自動提交模式,請使用connection物件的setautocommit()方法。如果將boolean false傳遞給setautocommit(),則關閉自動提交。我們可以傳遞乙個布林值true來重新開啟它。
trycatch(sqlexception se)
1、要取消掉jdbc的自動提交:void setautocommit(boolean autocommit)
2、執行各個sql語句,加入到批處理之中
3、如果所有語句執行成功,則提交事務 commit();如果出現了錯誤,則回滾:rollback()
try catch (exception e) catch (sqlexception e1)
}
JDBC資料庫事務
事務 一組邏輯操作單元,使資料從一種狀態變換到另一種狀態。事務處理 事務操作 保證所有事務都作為乙個工作單元來執行,即使出現了故障,都不能改變這種執行方式。當在乙個事務中執行多個操作時,要麼所有的事務都被提交 commit 那麼這些修改就永久地儲存下來 要麼資料庫管理系統將放棄所作的所有修改,整個事...
JDBC 資料庫事務
事務 一組邏輯操作單元,使資料從一種狀態變換到另一種狀態。事務處理 也稱為事務操作,保證所有事務都作為乙個工作單元來執行,即使出現了故障,都不能改變這種執行方式。當在乙個事務中執行多個操作時,要麼所有的事務都被提交 commit 那麼這些修改就永久的儲存下來 要麼資料庫管理系統將丟棄所作的所有修改,...
JDBC 之 資料庫事務
原子性 atomicity 原子性是指事務是乙個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。一致性 consistency 事務必須使資料庫從乙個一致性狀態變換到另外乙個一致性狀態。隔離性 isolation 事務的隔離性是指乙個事務的執行不能被其他事務干擾,即乙個事務內部的操作及使用...