數據庫事務

數據庫事務:單個邏輯工作單元執行的一系列操作,這些操作要麼完全地執行,要麼完全地不執行。

事務的四大特性(ACID):原子性、一致性、隔離性、持久性。
原子性:事務包含的全部操作要麼全部執行成功,要麼全部失敗回滾。
一致性:事務前後,數據庫的狀態都滿足所有完整性約束。
隔離性:多個事務併發執行時,一個事務的執行不影響另一個事務的執行。
持久性:當事務完成以後,該事務對數據庫的更改持久的保存在數據庫中,並不會被回滾。

併發事務引起的問題:
1. 更新丟失:兩個事務都同時更新一行數據,但是第二個事務卻中途失敗退出,導致對數據的兩個修改都失效了。這是因爲系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。
2. 髒讀:一個事務讀取另一個事務還沒有提交的數據。髒讀又稱無效數據讀出。比如:事務T1修改了一行數據,但是還沒有提交,這時候事務T2讀取了被事務T1修改後的數據,之後事務T1因爲某種原因Rollback了,那麼事務T2讀取的數據就是髒的。
3. 不可重複讀:在相同的事務內兩個相同的查詢,返回了不同的結果。例如:事務T1讀取某一數據,事務T2讀取並修改了該數據,T1爲了對讀取值進行檢驗而再次讀取該數據,便得到了不同的結果。
4. 幻讀:事務在操作過程中進行兩次查詢,第二次查詢出現了第一次查詢沒出現的內容或者缺少了第一次查詢出現的數據。例如:系統管理員A將數據庫中所有學生的成績從具體分數改爲ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣。這就叫幻讀。

事務的隔離級別:
更新丟失、髒讀、不可重複讀、幻讀都和事務的隔離級別有關。通過設置事務的隔離級別,可以避免以上情況發生。
1. 未授權讀取級別:也稱爲讀未提交。以操作同一行數據爲前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他寫事務(但允許其他讀事務)。此隔離級別可以防止更新丟失,但不能防止髒讀、不可重複讀、幻讀。此隔離級別可以通過“排他寫鎖”實現。
2. 授權讀取級別:也稱爲讀提交(Read Committed)。以操作同一行數據爲前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他讀事務和寫事務。此隔離級別可以防止更新丟失、髒讀,但不能防止不可重複讀、幻讀。此隔離級別可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。
3. 可重複讀取級別:可重複讀取(Repeatable Read)。
以操作同一行數據爲前提,讀事務禁止其他寫事務(但允許其他讀事務),未提交的寫事務禁止其他讀事務和寫事務。此隔離級別可以防止更新丟失、髒讀、不可重複讀,但不能防止幻讀。此隔離級別可以通過“共享讀鎖”和“排他寫鎖”實現。
4. 序列化級別:序列化(Serializable)。提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接着一個地執行,不能併發執行。此隔離級別可以防止更新丟失、髒讀、不可重複讀、幻讀。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。

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

數據庫範式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章