資料庫隔離級別
目的:保證事務併發讀取資料的正確性
(1)read uncommitted(讀未提交資料):允許事務讀取未被其他事務提交的變更資料,會出現髒讀、不可重複讀和虛讀。
(2)read committed(讀已提交資料):只允許事務讀取已經被其他事務提交的變更資料,可避免髒讀,仍會有不可重複讀和虛讀
(3)repeatable read(可重複讀):確保事務可以多次從乙個欄位中讀取相同的值,在此事務持續期間,禁止其他事務對此欄位的更新,可避免髒讀、不可重複讀仍會有虛讀。
(4)serializable(序列化):確保事務可以從乙個表中讀取相同的行,在事務持續期間,禁止其他事務對該錶執行插入、更新和刪除操作,可避免所有併發問題,但效能低。
mysql支援四種事務隔離級別,其中
repeatable read
為預設事務隔離級別。
設定說明:隔離級別越高,越能保證資料的完整性和一致性,但對併發性的影響越大。對於大多數應用程式,資料庫系統的隔離級別設為readcommitted。能避免髒讀取,而且具有較好的併發效能。對於不可重複讀、虛讀和第二類丟失更新這些併發問題,採用悲觀鎖或樂觀鎖。
悲觀鎖和樂觀鎖
悲觀鎖:每次拿資料時怕別人會修改,所以都會先上鎖,當其他事務要訪問該資料時就會阻塞。一般用在表鎖、行鎖、讀鎖和寫鎖,在操作前先上鎖。
樂觀鎖:每次拿資料時認為別人不會修改,不會上鎖,但在更新時會先判斷一下在此期間別人是否有更新該資料,可以使用版本號等機制。
適用於:讀取多、寫少的情況,可以提高吞吐量。
(1
)uncommitted read(ur
——未提交讀)
讀取資料時,對錶加in
表鎖,而不會對資料行加鎖。修改資料時,則在資料上加
x鎖以及相應表級別鎖(修改操作與
cs處理相同)。
併發性:丟失更新、髒讀、不可重複讀和虛讀都有可能發生
(2)cursor stability(
cs——游標穩定性)預設級別:僅鎖住當前處理的記錄
鎖定游標定位的當前行。讀取加ns
鎖,修改加
x鎖,帶有修改的查詢加
u鎖。鎖定持續到讀取下一條或事務結束。
併發性:丟失更新和髒讀不會發生;但有可能出現不可重複讀和虛讀。
(3)read statility(
rs——讀穩定性)
只是鎖定事務實際檢索和修改的行(讀取的話加ns
,修改的話加
x,有修改意向加u)
併發性:丟失更新、髒讀、不可重複讀不會發生;但有可能出現虛讀。
(4)repeatable read(
rr)
會對select
的所有行加鎖,對所有掃瞄的行加鎖
併發性:丟失更新、髒讀、不可重複讀和虛讀都不會發生
資料庫事務 隔離性 悲觀鎖和樂觀鎖
原子性 atomicity 原子性是指事務包含的操作要麼全部內容執行成功,要麼全部內容失敗回滾。一致性 consistency 一致性是指事務必須使資料庫乙個一致性狀態變換到另乙個一致性狀態,也就是事務操作執行前和操作執行後保持相同的一致性狀態,最經典的例子就是a跟b轉賬,a和b總數2000,不管相...
資料庫悲觀鎖和樂觀鎖簡述
鎖 locking 業務邏輯的實現過程中,往往需要保證資料訪問的排他性。如在金融系統的日終結算 處理中,我們希望針對某個 cut off 時間點的資料進行處理,而不希望在結算進行過程中 可能是幾秒種,也可能是幾個小時 資料再發生變化。此時,我們就需要通過一些機 制來保證這些資料在某個操作過程中不會被...
資料庫的悲觀鎖和樂觀鎖
資料庫的四種隔離級別 髒讀 不可重複讀 可重複讀 序列化,雖然四種隔離級別能夠處理事務問題,但是不夠靈活,於是有了悲觀鎖和樂觀鎖。悲觀鎖 對於外界的修改持保守態度,在整個資料處理中資料處於鎖定狀態。以mysql為例,select for update和lock in share model能夠實現悲...