資料庫的事務必須滿足4個特性: 原子性, 一緻性, 隔離性, 持久性,它們英文單詞首字母合起來就是:ACID
在這些事務特性中,資料“一緻性”為最終目标,其他特性都是為達到這個目标而采取的措施和手段。 資料庫管理系統一般采用重執行日志來保證原子性、一緻性和持久性。重執行日志記錄了資料庫變化的每一個動作,資料庫在一個事務中執行一部分操作後發生錯誤退出,資料庫即可根據重執行日志撤銷已經執行的操作。對于已經送出的事務即使資料庫崩潰,在重新開機資料庫時也能後根據日志對尚未持久化的資料進行相應的重執行操作。
1、事務原子性
定義:事務中的多個資料庫操作是一個不可分割的原子單元整體,隻有所有的操作執行成功,整個事務才送出。事務中的任何一個資料庫操作失敗,已經執行的任何操作都必須被撤銷,讓資料庫傳回初始狀态。
實作:事務内的一組操作全部成功(或者全部失敗),為了實作原子性,就需要通過日志:将所有對資料的操作都寫入日志,如果事務中的一部分操作已經成功,但後面部分操作,因為系統斷電,作業系統崩潰等問題而沒有成功執行,那麼就要通過回溯日志,将前面已經成功執行的操作撤銷,進而達到"全部執行失敗"的效果。
2、事務一緻性
事務操作成功後,保證資料不會被破壞。如A賬戶轉賬100元到B賬戶,不管操作成功與否,A和B賬戶的存款總額是不變的。
一緻性分為資料庫外部一緻性和内部一緻性:
i、資料庫外部一緻性:由外部的應用編碼來實作,即銀行的應用在進行轉賬的操作時,必須在同一事務内部調用對賬戶A和賬戶B的操作。如果在這個階段出現錯誤,這不是資料庫本身能解決的,也不屬于我們要讨論的範圍。
ii、資料庫内部的一緻性:在同一個事務内部的一組操作必須全部成功(或者全部失敗) 這就是事務原子性
3、持久性
一旦事務送出成功後,事務中所有的資料操作都必須被持久化到資料庫中。即使在事務送出後,資料庫馬上崩潰,在資料庫重新開機時,也必須保證能夠通過某種機制恢複資料。
4、事務隔離性
詳細轉載此篇部落格:
引用:https://blog.csdn.net/u014079773/article/details/52808193
1)事務并發所引起的問題:
髒讀:一個事務讀到另外一個事務還沒有送出的資料,我們稱之為髒讀。(進行存款事務時候,還沒有存完,允許查詢事務)
不可重複讀(Unrepeatable Read)
在資料庫通路中,一個事務範圍内兩個相同的查詢卻傳回了不同資料。這是由于查詢時系統中其他事務修改的送出而引起的。
例如:事務B中對某個查詢執行兩次,當第一次執行完時,事務A對其資料進行了修改。事務B中再次查詢時,資料發生了改變
幻讀(phantom read)
幻讀,是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣.
2)JDBC(隔離方案)事務隔離的四個級别:
1.READ_UNCOMMITTED
2.READ_COMMITTED
3.REPEATABLE_READ
4.SERIALIZABLE
從上往下,級别越來越高,并發性越來越差,安全性越來越高
髒讀 | 不可重複讀 | 幻讀 | |
Serializable | 不會 | 不會 | 不會 |
REPEATABLE READ | 不會 | 不會 | 會 |
READ COMMITTED | 不會 | 會 | 會 |
Read Uncommitted | 會 | 會 | 會 |
3)Spring(隔離方案)事務傳播行為
1.PROPAGATION_REQUIRED
2.RROPAGATION_REQUIRES_NEW
3.PROPAGATION_NESTED
4.PROPAGATION_SUPPORTS
5.PROPAGATION_NOT_SUPPORTED
6.PROPAGATION_NEVER
7.PROPAGATION_MANDATORY
Spring還有事務隔離級别、事務傳播行為、事務逾時時間、是否隻讀事務
1.事務逾時(Transaction Timeout):為了解決事務時間太長,消耗太多的資源,是以故意給事務設定一個最大時常,如果超過了,就復原事務。
2.隻讀事務(Readonly Transaction):為了忽略那些不需要事務的方法,比如讀取資料,這樣可以有效地提高一些性能。