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