事務
1、定義:所有操作必須成功完成,否則在每個操作中所作的所有更改都會備撤銷。
2、事務的acid
原子性atomicity 一致性consistency 隔離性isolation 持續性durability
2-1、原子性: 事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做
2-2、一致性: 事務執行的結果必須是資料庫從乙個一致性狀態變到另乙個一致性狀態。因此當資料庫只包含成功事務提交的結果時,
就說明資料庫處於一致性狀態。
2-3、隔離性: 乙個事務的執行不能被其他事務干擾。
2-4、持續性: 即永久性,乙個事務一旦提交,它對資料庫中資料的改變就應該是永久行的。
3、mysql的四中隔離級別
3-1、read uncommitted(讀取未提交的內)
所有事務都可以看到其他未提交事務的執行結果。 也稱之為髒讀,很少應用與實際
3-2、read committed(讀取提交內容)
乙個事務只能看見已提交事務所做的改變。
3-3、repeatable read(可重複讀)
mysql預設事務隔離級別,確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過,會導致幻讀。
幻讀指使用者讀取某一範圍資料行時,另乙個事務又在該範圍內插入了新行。當使用者再讀取該範圍的資料行時,會發現出現新的幻影行
3-4、serializable(可序列化)
在每個讀的資料行上加上共享鎖。這個級別可能導致大量的超時現象和鎖競爭。
4、事務隔離的原理
1、一次封鎖or兩段鎖
在大量併發訪問時候,為了預防死鎖,一般應用中推薦使用一次封鎖法,就是在方法的開始階段,已經預先知道會用到哪些資料,
然後全部鎖住,在方法執行之後,在全部解鎖。但這種方式不適用於資料庫,因為資料庫不知道會用到哪些資料。
資料庫採用的是兩段鎖協議,將事務分成兩個階段,加鎖階段和解鎖階段。
加鎖階段: 在對任何資料進行讀操作之前要申請並獲得s鎖(共享鎖,其他事務可以繼續加共享鎖,但不能加排它鎖),在進行寫
操作之前要申請x鎖(排它鎖,其他事務不能再獲得任何鎖)。如果加鎖不成功的話,則事務進入等待狀態,直到加鎖成功才能繼續執行。
解鎖階段: 當事務釋放了乙個封鎖以後,事務進入解鎖階段,在該階段只能進行解鎖操作不能再解析加鎖操作。
不可重複讀與幻讀的區別:
不可重複讀重點在於update和delete,而幻讀在於insert
5、mvcc在mysql的innodb實現
在innodb中,會在每行資料後新增兩個額外的隱藏的值來實現mvcc,這兩個值乙個記錄這行資料何時被建立,另乙個記錄這行
資料何時過期(或者被刪除)在實際操作中,儲存的並不是時間,而是事務的版本號,每開啟乙個新事務,事務的版本號就會
遞增。在可重複讀的事務隔離級別下:
select時,讀取建立版本號不大於當前事務版本好,刪除版本號為空或大於當前事務版本號
insert時,保持當前事務版本號為行的建立版本號
delete時,保持當前版本號為行的刪除版本號
update時,插入一條新記錄,儲存當前事務版本號為行建立的版本號,同時保持當前事務版本號到原來刪除的行
MySQL四種隔離級別
在sql標準中定義了四種隔離級別,每一種級別都規定了乙個事務中所做的修改,哪些是在事務內和事務間可見的,哪些是不可見的。較低階別的隔離通常可以執行更高的併發,系統的開銷也更低。未提交讀 read uncommitted 在未提交讀級別,事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取...
mysql四種隔離級別
髒讀 dirty reads 乙個事務正在對一條記錄做修改,在這個事務完成並提交前,這條記錄的資料就處於不一致狀態 這時另乙個事務也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些 髒 資料,並據此做進一步的處理,就會產生未提交的資料依賴關係。這種現象被形象地叫做 髒讀 第乙個事務可能會回滾,第...
Mysql四種隔離級別
什麼是事務?事務是應用程式中的一系列嚴密的操作,所有的操作必須成功完成,否則在每乙個操作中所有執行的更改都會撤銷。也就是事務具有原子性操作,乙個事務中的一系列操作,要麼全部成功,要麼全部都不做。事務的結束有兩種,當事務中的所有步驟全部執行成功時,事務提交。如果其中乙個步驟失敗,將會發生回滾操作,撤銷...