mysql 5.5預設儲存引擎(表型別)使用的是innodb,它是支援acid特性的~
acid,指資料庫的原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)。乙個支援事務(transaction)的資料庫系統,必需要具有這四種特性,否則在事務過程(transaction processing)當中,無法保證資料的正確性。
1.資料庫事務處理中出現的資料不一致的情況
在多個事務併發做資料庫操作的時候,如果沒有有效的避免機制,就會出現種種問題。大體上有四種問題,歸結如下:
1)丟失更新
如果兩個事務都要更新資料庫乙個欄位x,x=100
事務a
事務b讀取x=100
讀取x=100
寫入x=x+100
寫入x=x+200
事務結束x=200
事務結束x=300
最後x=300
這種情況事務a的更新就被覆蓋掉了、丟失了。
丟失更新說明事務進行資料庫寫操作的時候可能會出現的問題。
2)髒讀(未提交讀,乙個事務修改還沒提交,另乙個事務訪問)
防止乙個事務讀到另乙個事務還沒有提交的記錄。
如:事務a
事務b讀取x=100
寫入x=x+100
讀取x=200
事務回滾x=100
讀取x=100
事務結束x=100
事務讀取了未提交的資料
3)不可重複讀(在乙個事務週期內,如果兩次讀取同乙個記錄,在這兩次之間,另乙個事務修改並提交了記錄,造成乙個事務內多次讀取同乙個記錄出現不同的情況,強調的是記錄的修改)
乙個事務在自己沒有更新資料庫資料的情況,同乙個查詢操作執行兩次或多次的結果應該是一致的;如果不一致,就說明為不可重複讀。
還是用上面的例子
事務a
事務b讀取x=100
讀取x=100
讀取x=100
寫入x=x+100
讀取x=200
事務結束x=200
事務結束x=200
這種情況事務a多次讀取x的結果出現了不一致,即為不可重複讀。
4)虛讀(phantom read)(和不可重複讀發生的場景相同,但是強調的是記錄的新增和刪除)
事務a讀的時候讀出了15條記錄,事務b在事務a執行的過程中刪除(增加)了1條,事務a再讀的時候就變成了14(16)條,這種情況就叫做幻影讀。這裡要注意,innodb在repeatable read隔離級別時不會產生幻讀,其中使用了相關的處理措施,不信的話可以進行測試。
2.資料庫事務隔離級別
為了避免資料庫事務操作中的問題,在標準sql規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同:
1)未授權讀取(read uncommitted):允許髒讀取,但不允許更新丟失。如果乙個事務已經開始寫資料,則另外乙個資料則不允許同時進行寫操作,但允許其他事務讀此行資料。該隔離級別可以通過「排他寫鎖」實現。
2)授權讀取(read committed):允許不可重複讀取,但不允許髒讀取。這可以通過「瞬間共享讀鎖」和「排他寫鎖」實現。讀取資料的事務允許其他事務繼續訪問該行資料,但是未提交的寫事務將會禁止其他事務訪問該行。
3)可重複讀取(repeatable read):禁止不可重複讀取和髒讀取,但是有時可能出現幻影資料。這可以通過「共享讀鎖」和「排他寫鎖」實現。讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
4)序列化(serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能乙個接著乙個地執行,但不能併發執行。如果僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。
隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed,它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、虛讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
MySQL事務隔離級別
sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的 併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,...
MySQL事務隔離級別
read uncommitted 未提交讀 在 read uncommitted 級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀 dirty read 這個級別會導致很多問題,從效能上來說,read uncommitted 不會比其他的級別好太多,...