概念事務指的是滿足 acid 特性的一組操作,可以通過 commit 提交乙個事務,也可以使用 rollback 進行回滾。
acid
原子性(atomicity)
事務被視為不可分割的最小單元,事務的所有操作要麼全部提交成功,要麼全部失敗回滾。
回滾可以用回滾日誌來實現,回滾日誌記錄著事務所執行的修改操作,在回滾時反向執行這些修改操作即可。
一致性(consistency)
資料庫在事務執行前後都保持一致性狀態。在一致性狀態下,所有事務對乙個資料的讀取結果都是相同的。
隔離性(isolation)
乙個事務所做的修改在最終提交以前,對其它事務是不可見的。
永續性(durability)
一旦事務提交,則其所做的修改將會永遠儲存到資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。
使用重做日誌來保證永續性。
事務的 acid 特性概念簡單,但不是很好理解,主要是因為這幾個特性不是一種平級關係:
只有滿足一致性,事務的執行結果才是正確的。
在無併發的情況下,事務序列執行,隔離性一定能夠滿足。此時只要能滿足原子性,就一定能滿足一致性。
在併發的情況下,多個事務並行執行,事務不僅要滿足原子性,還需要滿足隔離性,才能滿足一致性。
事務滿足持久化是為了能應對資料庫崩潰的情況。
autocommit
mysql 預設採用自動提交模式。也就是說,如果不顯式使用 start transaction 語句來開始乙個事務,那麼每個
查詢都會被當做乙個事務自動提交。
在併發環境下,事務的隔離性很難保證,因此會出現很多併發一致性問題。
丟失修改
t1 和 t2 兩個事務都對乙個資料進行修改,t1 先修改,t2 隨後修改,t2 的修改覆蓋了 t1 的修改。
讀髒資料
t1 修改乙個資料,t2 隨後讀取這個資料。如果 t1 撤銷了這次修改,那麼 t2 讀取的資料是髒資料。
不可重複讀
t2 讀取乙個資料,t1 對該資料做了修改。如果 t2 再次讀取這個資料,此時讀取的結果和第一次讀取的結果不同。
幻影讀t1 讀取某個範圍的資料,t2 在這個範圍內插入新的資料,t1 再次讀取這個範圍的資料,此時讀取的結果和和第一次
讀取的結果不同。
產生併發不一致性問題主要原因是破壞了事務的隔離性,解決方法是通過併發控制來保證隔離性。併發控制可以通過
封鎖來實現,但是封鎖操作需要使用者自己控制,相當複雜。資料庫管理系統提供了事務的隔離級別,讓使用者以一種更
輕鬆的方式處理併發一致性問題
封鎖粒度
mysql 中提供了兩種封鎖粒度:行級鎖以及表級鎖。
應該盡量只鎖定需要修改的那部分資料,而不是所有的資源。鎖定的資料量越少,發生鎖爭用的可能就越小,系統的
併發程度就越高。
但是加鎖需要消耗資源,鎖的各種操作(包括獲取鎖、釋放鎖、以及檢查鎖狀態)都會增加系統開銷。因此封鎖粒度
越小,系統開銷就越大。
在選擇封鎖粒度時,需要在鎖開銷和併發程度之間做乙個權衡。
封鎖型別
讀寫鎖排它鎖(exclusive),簡寫為 x 鎖,又稱寫鎖。
共享鎖(shared),簡寫為 s 鎖,又稱讀鎖。
有以下兩個規定:
乙個事務對資料物件 a 加了 x 鎖,就可以對 a 進行讀取和更新。加鎖期間其它事務不能對 a 加任何鎖。
乙個事務對資料物件 a 加了 s 鎖,可以對 a 進行讀取操作,但是不能進行更新操作。加鎖期間其它事務能對 a
加 s 鎖,但是不能加 x 鎖。
意向鎖使用意向鎖(intention locks)可以更容易地支援多粒度封鎖。
在存在行級鎖和表級鎖的情況下,事務 t 想要對錶 a 加 x 鎖,就需要先檢測是否有其它事務對錶 a 或者表 a 中的任
意一行加了鎖,那麼就需要對錶 a 的每一行都檢測一次,這是非常耗時的。
意向鎖在原來的 x/s 鎖之上引入了 ix/is,ix/is 都是表鎖,用來表示乙個事務想要在表中的某個資料行上加 x 鎖或 s
鎖。有以下兩個規定:
乙個事務在獲得某個資料行物件的 s 鎖之前,必須先獲得表的 is 鎖或者更強的鎖;
乙個事務在獲得某個資料行物件的 x 鎖之前,必須先獲得表的 ix 鎖。
通過引入意向鎖,事務 t 想要對錶 a 加 x 鎖,只需要先檢測是否有其它事務對錶 a 加了 x/ix/s/is 鎖,如果加了就表
示有其它事務正在使用這個表或者表中某一行的鎖,因此事務 t 加 x 鎖失敗。
解釋如下:
任意 is/ix 鎖之間都是相容的,因為它們只是表示想要對錶加鎖,而不是真正加鎖;
s 鎖只與 s 鎖和 is 鎖相容,也就是說事務 t 想要對資料行加 s 鎖,其它事務可以已經獲得對錶或者表中的行的
s 鎖。
封鎖協議
**封鎖協議
一級封鎖協議
事務 t 要修改資料 a 時必須加 x 鎖,直到 t 結束才釋放鎖。
可以解決丟失修改問題,因為不能同時有兩個事務對同乙個資料進行修改,那麼事務的修改就不會被覆蓋。
二級封鎖協議
在一級的基礎上,要求讀取資料 a 時必須加 s 鎖,讀取完馬上釋放 s 鎖。
可以解決讀髒資料問題,因為如果乙個事務在對資料 a 進行修改,根據 1 級封鎖協議,會加 x 鎖,那麼就不能再加 s
鎖了,也就是不會讀入資料。
**封鎖協議
在二級的基礎上,要求讀取資料 a 時必須加 s 鎖,直到事務結束了才能釋放 s 鎖。
可以解決不可重複讀的問題,因為讀 a 時,其它事務不能對 a 加 x 鎖,從而避免了在讀的期間資料發生改變。
Python工程師必備哪些技能?
python工程師必備哪些技能?學習路線是什麼?隨著人工智慧時代的到來以及國家一系列政策支援,python熱度大增吸引了更多人加入學習。為了能夠快速的掌握python專業技能,成為企業急需的高階人才,絕大多數人會選擇參加專業的學習。python具有簡單 易學 免費 開源 可移植 可擴充套件 可嵌入 ...
前端工程師必備PS技能
ps參考線及其輔助 檢視 新建參考線 也可以快捷鍵ctrl r,顯示區的上側和左側就會出現標尺。任意點選中,並拖動標尺,便會出現淺藍色的輔助線。只有在移動工具下,才能拖動某一條參考線。刪除參考線的方式,來的回 去,拖動參考線把它移動到標尺處。上面的標尺對應的是水平參考線,左邊的標尺對應的是豎直參考線...
雲計算工程師必備技能
隨著資訊現代化的發展,人們對資訊資源的需求不斷地增長,雖然現在的資訊充斥著整個網路,但是如何能快速的獲得我們所需的有效的資源才是重點,雲計算技術工程師就是在這個需求下產生的。在雲計算工作中,it專業人員通常負責公司雲計畫的各個方面。這通常涉及雲資源,服務和應用程式的概念化,規劃,設計,實施,優化,管...