事務:用來保證幾個操作一致性
事務必須服從ISO/IEC所制定的ACID原則篮昧。
ACID是原子性(atomicity)懊昨、一致性(consistency)、隔離性 (isolation)和持久性(durability)的縮寫躏惋。
事務的原子性表示事務執(zhí)行過程中的任何失敗都將導致事務所做的任何修改失效。
一致性表示 當事務執(zhí)行失敗時,所有被該事務影響的數(shù)據(jù)都應該恢復到事務執(zhí)行前的狀態(tài)域仇。
隔離性表示在事務執(zhí)行過程中對數(shù)據(jù)的修改,在事務提交之前對其他事務不可見垦细。
持 久性表示已提交的數(shù)據(jù)在事務執(zhí)行失敗時,數(shù)據(jù)的狀態(tài)都應該正確叹谁。
簡單理解就是 保證一組sql語句的執(zhí)行完整性憔涉、要么全部成功兜叨、要么全部失敗
由于不同的業(yè)務環(huán)境對事物有不同的要求、通常把事物寫到java程序中來控制sql語句通知db環(huán)境跪但。
默認情況下是一條語句一個事物執(zhí)行的
java.sql.Connection 中提供了對于事物的控制方法
public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
JDBC的事務支持
JDBC對事務的支持體現(xiàn)在三個方面:
1.自動提交模式(Auto-commit mode)
Connection提供了一個auto-commit的屬性來指定事務何時結束爱榔。
a.當auto-commit為true時筛欢,當每個獨立SQL操作的執(zhí)行完畢版姑,事務立即自動提交冯凹,也就是說每個SQL操作都是一個事務匈庭。
一個獨立SQL操作什么時候算執(zhí)行完畢,JDBC規(guī)范是這樣規(guī)定的:
對數(shù)據(jù)操作語言(DML鸽扁,如insert,update,delete)和數(shù)據(jù)定義語言(如create,drop),語句一執(zhí)行完就視為執(zhí)行完畢骡和。
對select語句,當與它關聯(lián)的ResultSet對象關閉時婆赠,視為執(zhí)行完畢。
對存儲過程或其他返回多個結果的語句植兰,當與它關聯(lián)的所有ResultSet對象全部關閉份帐,所有update count(update,delete等語句操作影響的行數(shù))和output parameter(存儲過程的輸出參數(shù))都已經(jīng)獲取之后,視為執(zhí)行完畢楣导。
b. 當auto-commit為false時废境,每個事務都必須顯示調(diào)用commit方法進行提交,或者顯示調(diào)用rollback方法進行回滾筒繁。auto-commit默認為true噩凹。
JDBC提供了5種不同的事務隔離級別,在Connection中進行了定義毡咏。
2.事務隔離級別(Transaction Isolation Levels)
JDBC定義了五種事務隔離級別:
TRANSACTION_NONE JDBC驅動不支持事務
TRANSACTION_READ_UNCOMMITTED 允許臟讀驮宴、不可重復讀和幻讀。
TRANSACTION_READ_COMMITTED 禁止臟讀呕缭,但允許不可重復讀和幻讀堵泽。
TRANSACTION_REPEATABLE_READ 禁止臟讀和不可重復讀,單運行幻讀恢总。
TRANSACTION_SERIALIZABLE 禁止臟讀迎罗、不可重復讀和幻讀。
3.保存點(SavePoint)
JDBC定義了SavePoint接口片仿,提供在一個更細粒度的事務控制機制纹安。
當設置了一個保存點后,可以rollback到該保存點處的狀態(tài),而不是rollback整個事務厢岂。
Connection接口的setSavepoint和releaseSavepoint方法可以設置和釋放保存點光督。
JDBC規(guī)范雖然定義了事務的以上支持行為,但是各個JDBC驅動塔粒,數(shù)據(jù)庫廠商對事務的支持程度可能各不相同可帽。如果在程序中任意設置,可能得不到想要的效果窗怒。為此映跟,JDBC提供了DatabaseMetaData接口,提供了一系列JDBC特性支持情況的獲取方法扬虚。比如努隙,通過DatabaseMetaData.supportsTransactionIsolationLevel方法可以判斷對事務隔離級別的支持情況,通過DatabaseMetaData.supportsSavepoints方法可以判斷對保存點的支持情況辜昵。
與事務相關的理論
1.事務(Transaction)的四個屬性(ACID)
原子性(Atomic) 對數(shù)據(jù)的修改要么全部執(zhí)行荸镊,要么全部不執(zhí)行。
一致性(Consistent) 在事務執(zhí)行前后堪置,數(shù)據(jù)狀態(tài)保持一致性躬存。
隔離性(Isolated) 一個事務的處理不能影響另一個事務的處理。
持續(xù)性(Durable) 事務處理結束舀锨,其效果在數(shù)據(jù)庫中持久化岭洲。
2.事務并發(fā)處理可能引起的問題
臟讀(dirty read) 一個事務讀取了另一個事務尚未提交的數(shù)據(jù),
不可重復讀(non-repeatable read) 一個事務的操作導致另一個事務前后兩次讀取到不同的數(shù)據(jù)
幻讀(phantom read) 一個事務的操作導致另一個事務前后兩次查詢的結果數(shù)據(jù)量不同坎匿。
舉例:
事務A盾剩、B并發(fā)執(zhí)行時,
當A事務update后替蔬,B事務select讀取到A尚未提交的數(shù)據(jù)告私,此時A事務rollback,則B讀到的數(shù)據(jù)是無效的"臟"數(shù)據(jù)承桥。
當B事務select讀取數(shù)據(jù)后驻粟,A事務update操作更改B事務select到的數(shù)據(jù),此時B事務再次讀去該數(shù)據(jù)凶异,發(fā)現(xiàn)前后兩次的數(shù)據(jù)不一樣蜀撑。
當B事務select讀取數(shù)據(jù)后,A事務insert或delete了一條滿足A事務的select條件的記錄唠帝,此時B事務再次select屯掖,發(fā)現(xiàn)查詢到前次不存在的記錄("幻影")玄柏,或者前次的某個記錄不見了襟衰。