事務(wù)指的是滿足ACID特性的一組操作,可以通過Commit提交一個事務(wù),也可以使用Rollback進行回滾霉翔。
一、ACID
事務(wù)其實就是并發(fā)控制的基本單位苞笨,數(shù)據(jù)庫事務(wù)的ACID四大特性是事務(wù)的基礎(chǔ)债朵。
- Atomicity(原子性):事務(wù)被視為不可分割的最小單元,事務(wù)的所有操作要么全部提交成功瀑凝,要么全部失敗回滾序芦。回滾可以用回滾日志來實現(xiàn)粤咪,回滾日志記錄著事務(wù)所執(zhí)行的修改操作谚中,在回滾時反向執(zhí)行這些修改操作即可。
- Consistency(一致性):數(shù)據(jù)庫在事務(wù)執(zhí)行前后都保持一致性狀態(tài)。在一致性狀態(tài)下宪塔,所有事務(wù)對一個數(shù)據(jù)的讀取結(jié)果都是相同的磁奖。
- Isolation(隔離性):一個事務(wù)所做的修改在最終提交以前茸塞,對其它事務(wù)是不可見的丰捷。
-
Durability(持久性):一旦事務(wù)提交盘寡,則其所做的修改將會永遠保存到數(shù)據(jù)庫中不跟。即使系統(tǒng)發(fā)生崩潰,事務(wù)執(zhí)行的結(jié)果也不能丟失咒唆。使用重做日志來保證持久性锭环。
ACID特性之間的關(guān)系
MySQL 默認采用自動提交模式禾酱。也就是說抄囚,如果不顯式使用START TRANSACTION語句來開始一個事務(wù)霉赡,那么每個查詢都會被當做一個事務(wù)自動提交。
二怠苔、事務(wù)的隔離級別
數(shù)據(jù)庫的一致性和隔離性其實是一個需要開發(fā)者去權(quán)衡的東西同廉,為數(shù)據(jù)庫提供什么樣的隔離性層級就決定了數(shù)據(jù)庫的性能以及可以達到什么樣的一致性。SQL標準中定義了四種數(shù)據(jù)庫的事務(wù)的隔離級別:
- Read uncommitted (未提交讀):使用查詢語句不會加鎖柑司,可能讀到未提交事務(wù)更新的行(臟讀)。
- Read committed (已提交讀):會出現(xiàn)不可重復讀锅劝。在一個事務(wù)中兩次查詢結(jié)果可能由于另一個事務(wù)的提交而不同攒驰。
- Repeatable read (可重復讀):可能出現(xiàn)幻讀」示簦幻讀的結(jié)果其實和不可重復讀是一樣的表現(xiàn)玻粪,差異就在于,不可重復讀诬垂,主要是針對其他事務(wù)進行了編輯(update)和刪除(delete)操作劲室。而幻讀主要是針對插入(insert)操作。也就是在一個事務(wù)生命周期內(nèi)结窘,會查詢到另外一個事務(wù)新插入的數(shù)據(jù)很洋。
- Serializable (可串行化)
三、鎖
1.鎖的粒度
Mysql提供了兩種封鎖粒度:行級鎖以及表級鎖隧枫。
應(yīng)該盡量只鎖定需要修改的那部分數(shù)據(jù)喉磁,而不是所有的資源。鎖定的數(shù)據(jù)量越少官脓,發(fā)生鎖爭用的可能就越小协怒,系統(tǒng)的并發(fā)程度就越高。
2.鎖類型
(1)讀寫鎖
- 排它鎖(Exclusive)卑笨,簡寫為 X 鎖孕暇,又稱寫鎖。
- 共享鎖(Shared),簡寫為 S 鎖妖滔,又稱讀鎖隧哮。
有以下兩個規(guī)定:
- 一個事務(wù)對數(shù)據(jù)對象 A 加了 X 鎖,就可以對 A 進行讀取和更新铛楣。加鎖期間其它事務(wù)不能對 A 加任何鎖近迁。
- 一個事務(wù)對數(shù)據(jù)對象 A 加了 S 鎖,可以對 A 進行讀取操作簸州,但是不能進行更新操作鉴竭。加鎖期間其它事務(wù)能對 A 加 S 鎖,但是不能加 X 鎖岸浑。
(2)意向鎖
意向鎖在原來的 X/S 鎖之上引入了 IX/IS搏存,IX/IS 都是表鎖,用來表示一個事務(wù)想要在表中的某個數(shù)據(jù)行上加 X 鎖或 S 鎖矢洲。有以下兩個規(guī)定: - 一個事務(wù)在獲得某個數(shù)據(jù)行對象的 S 鎖之前璧眠,必須先獲得表的 IS 鎖或者更強的鎖;
- 一個事務(wù)在獲得某個數(shù)據(jù)行對象的 X 鎖之前读虏,必須先獲得表的 IX 鎖责静。
通過引入意向鎖,事務(wù) T 想要對表 A 加 X 鎖盖桥,只需要先檢測是否有其它事務(wù)對表 A 加了 X/IX/S/IS 鎖灾螃,如果加了就表示有其它事務(wù)正在使用這個表或者表中某一行的鎖,因此事務(wù) T 加 X 鎖失敗揩徊。
各種鎖的兼容關(guān)系如下:
解釋如下:
- 任意 IS/IX 鎖之間都是兼容的腰鬼,因為它們只是表示想要對表加鎖,而不是真正加鎖塑荒;
- S 鎖只與 S 鎖和 IS 鎖兼容熄赡,也就是說事務(wù) T 想要對數(shù)據(jù)行加 S 鎖,其它事務(wù)可以已經(jīng)獲得對表或者表中的行的 S 鎖齿税。