事務的定義:
事務(transaction)是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。通過事務,sql server能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。事務通常是以begin transaction開始,以commit或rollback結束。commit表示提交,即提交事務的所有操作。具體地說就是將事務中所有對資料庫的更新寫回到磁碟上的物理資料庫中去,事務正常結束。rollback表示回滾,即在事務執行的過程中發生了某種故障,事務不能繼續進行,系統將事務中對資料庫的所有以完成的操作全部撤消,滾回到事務開始的狀態。
事務的四大特性(acid特性):
原子性(atomicity)事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。
一致性(consistency)事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)乙個事務的執行不能被其他事務干擾。
持續性/永久性(durability)乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。
併發可以定義為多個程序在相同時間訪問或者更改共享資料的能力。一般資料庫為了提高效能,都允許多個客戶端同時訪問資料庫,也就是說資料庫中某個相同的資料在相同的時間段內同時有多個事務同時進行,這就是事務的併發。如果在事務併發時並沒有採取相應的隔離措施,就很容易造成資料的丟失,破壞。
多個事務同時訪問資料庫時候,會發生下列5類問題,包括3類資料讀問題,2類資料更新問題:
a:資料更新問題:
第一類丟失更新:a事務撤銷時,把已經提交的b事務的更新資料覆蓋了;
第二類丟失更新:a事務提交時覆蓋了b事務提交的資料;
b:資料讀問題
髒讀(dirty read):a事務讀取b事務尚未提交的更改資料,並在這個資料基礎上操作。如果b事務回滾,那麼a事務讀到的資料根本不是合法的,稱為髒讀。在oracle中,由於有version控制,不會出現髒讀;
不可重複讀(unrepeatable read):a事務讀取了b事務已經提交的更改(或刪除)資料。比如a事務第一次讀取資料,然後b事務更改該資料並提交,a事務再次讀取資料,兩次讀取的資料不一樣。;
幻讀(phantom read):a事務讀取了b事務已經提交的新增資料。注意和不可重複讀的區別,這裡是新增,不可重複讀是更改(或刪除)。這兩種情況對策是不一樣的,對於不可重複讀,只需要採取行級鎖防止該記錄資料被更改或刪除,然而對於幻讀必須加表級鎖,防止在這個表中新增一條資料。
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted、read committed、repeatable read、serializable,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。
serializable (序列化): 新增範圍鎖(比如表鎖,頁鎖等),直到transaction a結束。以此阻止其它transaction b對此範圍內的insert,update等操作。幻讀,髒讀,不可重複讀等問題都不會發生。
repeatable read (可重複讀): 對於讀出的記錄,新增共享鎖直到transaction a結束。其它transaction b對這個記錄的試圖修改會一直等待直到transaction a結束。可能發生的問題:當執行乙個範圍查詢時,可能會發生幻讀。
read committed (讀已提交): 在transaction a中讀取資料時對記錄新增共享鎖,但讀取結束立即釋放。其它transaction b對這個記錄的試圖修改會一直等待直到a中的讀取過程結束,而不需要整個transaction a的結束。所以,在transaction a的不同階段對同一記錄的讀取結果可能是不同的。可能發生的問題:不可重複讀。
read uncommitted (讀未提交): 不新增共享鎖。所以其它transaction b可以在transaction a對記錄的讀取過程中修改同一記錄,可能會導致a讀取的資料是乙個被破壞的或者說不完整不正確的資料。另外,在transaction a中可以讀取到transaction b(未提交)中修改的資料。比如transaction b對r記錄修改了,但未提交。此時,在transaction a中讀取r記錄,讀出的是被b修改過的資料。可能發生的問題:髒讀。
資料庫事務以及JDBC事務隔離級別
是併發控制的單元,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位.原子性 atomic 對資料的修改要麼全部執行,要麼全部不執行。一致性 consistent 在事務執行前後,資料狀態保持一致性。隔離性 isolated 乙個事務的處理不能影響另乙個事務的處理。持...
資料庫事務以及隔離級別
例 張三給李四轉賬10元 李四賬戶增加10元,張三賬戶減少十元,要麼都執行成功,要麼都失敗 回滾 例 張三給李四轉20元,王五給孫六轉10元。兩個事務互不干擾,不能張三的錢轉給孫六。例 張三轉給李四40元 張三和李四的總賬戶餘額不變。原子性和隔離性保證一致性 這四種隔離級別是sql的標準定義。mys...
資料庫事務的隔離以及spring的事務傳播機制
資料庫的事務隔離 mysql innodb事務的隔離級別有四級,預設是 可重複讀 rr repeatable read oracle預設的是提交讀。rc 四個級別逐漸增強,每個級別解決乙個問題。spring的事務傳播機制 spring在transactiondefinition介面中規定了7種型別的...