標籤:

DB(1):事務

一、事務的基本要素(ACID)

1、原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。

2、一致性(Consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

3、隔離性(Isolation):同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

4、持久性(Durability):事務完成後,事務對資料庫的所有更新將被保存到資料庫,不能回滾。

二、事務的並發問題

1、臟讀:事務A讀取了事務B更新的數據,然後B回滾操作,那麼A讀取到的數據是臟數據

2、不可重複讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新並提交,導致事務A多次讀取同一數據時,結果不一致。

3、幻讀:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

二、事務的隔離級別(級別由高到低)

  ① Serializable (串列化):Serializable 是最高的事務隔離級別,在該級別下,以鎖表的方式事務串列化順序執行,可以避免臟讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫性能,一般不使用。

  ② Repeatable read (可重複讀):可避免臟讀、不可重複讀的發生。不可重複讀對應的是修改,即UPDATE操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入INSERT操作,而不是UPDATE操作。

  ③ Read committed (讀已提交):可避免臟讀的發生。

  ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。

值得一提的是:大多數資料庫默認的事務隔離級別是Read committed,比如Sql Server , Oracle。Mysql的默認隔離級別是Repeatable read。

在MySQL資料庫中查看當前事務的隔離級別:

select @@tx_isolation;

在MySQL資料庫中設置事務的隔離 級別:

set [glogal | session] transaction isolation level 隔離級別名稱;

set tx_isolation=』隔離級別名稱;』

補充:

  1、SQL規範所規定的標準,不同的資料庫具體的實現可能會有些差異

  2、mysql中默認事務隔離級別是可重複讀時並不會鎖住讀取到的行

  3、事務隔離級別為讀提交時,寫數據只會鎖住相應的行

  4、事務隔離級別為可重複讀時,如果有索引(包括主鍵索引)的時候,以索引列為條件更新數據,會存在間隙鎖、行鎖、下一鍵鎖的問題,從而鎖住一些行;如果沒有索引,更新數據時會鎖住整張表。

  5、事務隔離級別為串列化時,讀寫數據都會鎖住整張表

   6、隔離級別越高,越能保證數據的完整性和一致性,但是對並發性能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程序,可以優先考慮把資料庫系統的隔離級別設為Read Committed,它能夠避免臟讀取,而且具有較好的並發性能。儘管它會導致不可重複讀、幻讀這些並發問題,在可能出現這類問題的個別場合,可以由應用程序採用悲觀鎖或樂觀鎖來控制。


推薦閱讀:

SQL 大法好,退果保平安
win7如何安裝SQL資料庫2000?
什麼是最好的oracle sql 開發工具?
使用CUDA加速SQL查詢的研究狀況目前如何,未來的發展會怎樣?
MySQL入門(二):基礎練習

TAG:SQL |