數據庫中的事務是可以并發執行的,由此帶來四種并發問題:
一、丟失更新 update lost
1.回滾丟失 事務A修改X, 事務B修改X, 事務B回滾,事務A提交。結果:事務A的修改丟失了
2.覆蓋丟失 并發的事務A和A'執行同樣的任務, A讀取X, B讀取X, A將X+1寫回,A'將X+1寫回。結果:X應為X+2,實際卻為X+1
二、臟讀取 dirty read
事務A修改數據X(此時A沒有commit),事務B讀取X,事務A回滾。 結果 : 事務B讀取的X不準確
三、不可重復讀 Non-Repeatable Read
事務A讀取數據X ,事務B修改數據X ,然后事務A再讀該數據,結果:事務A兩次讀取的數據不一致。
四、幻想讀 Phantom Read 讀取的數據集未改變,但是條件數據集改變,造成事務A兩次讀取的數據不一致。
解決方案:
Sql標準隔離級別
|
Dirty Read
|
NonRepeatable Read
|
Phantom Read
|
Read uncommitted
|
Possible
|
Possible
|
Possible
|
Read committed
|
Not possible
|
Possible
|
Possible
|
Repeatable read
|
Not possible
|
Not possible
|
Possible
|
Serializable
|
Not possible
|
Not possible
|
Not possible
|
Serializable 全序列化 提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,但不能并發執行。如果僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。
Repeatable Read 可重復讀取 禁止不可重復讀取和臟讀取,但是有時可能出現幻影數據。這可以通過“共享讀鎖”和“排他寫鎖”實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
Read Committed 授權讀取 允許不可重復讀取,但不允許臟讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。
Read Uncommitted 未授權讀取 允許臟讀取,但不允許更新丟失。如果一個事務已經開始寫數據,則另外一個數據則不允許同時進行寫操作,但允許其他事務讀此行數據。該隔離級別可以通過“排他寫鎖”實現。
隔離級別的實現原理:
………………
其他相關知識
事務定義:是指作為單個邏輯工作單元執行的一系列操作。要么全部執行,要么全部不執行。
事務四種屬性: ACID 原子性、一致性、隔離性和持久性
A : 要么全都執行,要么全都不執行
C: 所有的數據都保持一致狀態 賬戶A轉出100$給賬戶B , 保證賬戶A -100$,賬戶B +100$
I: 由并發事務所作的修改必須與任何其它并發事務所作的修改隔離。數據查看可串行。
D:事務完成之后,它對于系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。
參考資料:
http://blog.csdn.net/yongyuana01/archive/2009/02/25/3936482.aspx
http://epub.itpub.net/3/4.htm
http://baike.baidu.com/view/1298364.html?fromTaglist
閱讀全文
類別:技術天地 查看評論