1. 程式人生 > >數據庫事務

數據庫事務

數據庫 事務

事務的四個特性 (ACID) ,分別是原子性( Atomicity), 一致性( Consistency), 隔離性( Isolation), 持久性( Durability)。一致性是事務的目的,原子性,隔離性,持久性是一致性的必要條件。


隔離性:多個並發事務之間要相互隔離,對於任意兩個並發的事務T1和T2,在事務T1看來,T2要麽在T1開始之前就已經結束,要麽在T1結束之後才開始,這樣每個事務都感覺不到有其他事務在並發地執行。


隔離級別有四種:

1、Serializable :最嚴格的級別,事務串行執行,資源消耗最大。

2、REPEATABLE READ :保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。避免了“臟讀取”和“不可重復讀取”的情況,但是帶來了更多的性能損失。

3、READ COMMITTED :大多數主流數據庫的默認事務等級,保證了一個事務不會讀到另一個並行事務已修改但未提交的數據,避免了“臟讀取”。該級別適用於大多數系統。

4、Read Uncommitted :讀取過程中會讀取到非法數據。


不可重復讀、臟讀、幻讀的區別:

臟讀是某一事務讀取了另一個事務未提交的臟數據。

不可重復讀則是讀取了前一事務提交的數據,在某些情況下,不可重復讀並不是問題,以最終查詢的結果為準。

不可重復讀查詢的都是同一個數據項,而幻讀針對的是一批數據整體(比如數據的個數)。


四種隔離級別與讀取事務和寫事務:

讀取未提交,讀不會阻塞任何事務,寫只阻塞寫,會導致讀出現臟讀、不可重復讀、幻影讀。

讀取已提交,讀不會阻塞任何事務,寫阻塞讀、寫,因為寫阻塞讀,排除“臟讀” 問題,但是讀還是不阻塞寫,不可重復讀、幻影讀會出現。

可重復讀,讀只阻塞寫,寫阻塞讀、寫,讀阻塞寫避免了“不可重復讀”的問題,但是讀事務並沒有阻塞對數據庫的插入操作,所以此 時“幻影讀”問題照樣存在。

Serializable 數據庫系統會保證執行此種隔離級別事務的效果和順序執行的效果一致。


默認的隔離級別:


在MySQL數據庫中默認的隔離級別為Repeatable read (可重復讀)。

而在Oracle數據庫中,只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,其中默認的為Read committed級別。


並發控制:

在每個讀的數據行上加上共享鎖

此時我們一般采用READ COMMITTED的隔離級別,然後再結合以下幾種並發控制的鎖定策略:

* 樂觀所

* 悲觀鎖

* 樂觀離線鎖

* 悲觀離線鎖

此時其實並發是由應用程序來控制的,而事務的隔離由數據庫系統來管理。

在分布式的高並發環境下,對於核心業務邏輯的檢查,要采用加鎖機制。使用for update就是一個很好的在分布式環境下的控制手段。


事務常用的兩個屬性:readonly和timeout,設置事務的超時時間,一般用於防止大事務的發生。還是那句話,事務要盡可能的小!


本文出自 “淺談技術” 博客,請務必保留此出處http://netpeak.blog.51cto.com/1135737/1939104

數據庫事務