1.事務(wù)的概念
- 事務(wù): 事務(wù)是由單獨(dú)單元的一個或者多個SQL語句組成圆恤,在這個單元中,每個語句是相互依賴的。
- 描述性理解: 這個單獨(dú)單元是一個整體蚂蕴,如果政體中的某個語句執(zhí)行失敗或者產(chǎn)生錯誤低散,則整個單元將會回滾。所有受到影響的數(shù)據(jù)將會返回到事務(wù)開始以前的狀態(tài)骡楼;只有當(dāng)單元中所有的語句都執(zhí)行成功熔号,事務(wù)才會被順利執(zhí)行。
-
存儲引擎: 在MySQL 中使用不同的存儲技術(shù)將數(shù)據(jù)存儲在文件或者內(nèi)存中鸟整。
-
show engines:
就可以查看mysql支持的存儲引擎引镊; - 常見的存儲引擎:
innodb
,myisam
,memory
。 其中篮条,只有innodb
支持事務(wù)機(jī)制弟头。
-
2. 事務(wù)的屬性(ACID)
-
原子性(Atomicity)
事務(wù)是一個不可分割的工作的單位,如同原子一般涉茧。事務(wù)中的操作要么都發(fā)生要么都不發(fā)生赴恨。 -
一致性(Consistency)
事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換為另一個一致性狀態(tài)。 -
隔離性(Isolation)
一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾伴栓,一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的伦连,并發(fā)執(zhí)行的各個事務(wù)之間不能相互干擾。 -
持久性(Durability)
一個事務(wù)一旦被提交挣饥,他對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的除师,接下來的其他操作甚至數(shù)據(jù)庫的故障不應(yīng)該對它有任何影響。
3. 數(shù)據(jù)庫的隔離級別
-
不設(shè)置隔離級別引發(fā)的問題:
- 臟讀 : 對于兩個事務(wù)T1扔枫,T2汛聚; T1 讀取了已經(jīng)被T2更新但還沒提交的字段。若T2回滾短荐,則T1讀取的內(nèi)容就是臨時且無效的倚舀。
- 不可重復(fù)讀: 對于事務(wù)T1,T2忍宋; T1 讀取了一個字段痕貌,然后T2 更新了該字段。當(dāng)T1再次讀取該字段時糠排,與上次讀取的值不同舵稠。
- 幻讀: 對于兩個事務(wù)T1,T2入宦; T1從一個表中讀取了一個字段哺徊,然后T2在該表中插入了一些行的行;當(dāng)T1再次讀取同一個表乾闰,就會多出幾行落追。
-
隔離級別
- 設(shè)置隔離級別的必要性: 避免各個事務(wù)的并發(fā)問題。
- **讀未提交(read uncommited) : ** 允許事務(wù)讀取未被其他事務(wù)提交的數(shù)據(jù)涯肩;可能出現(xiàn)的問題:
臟讀
轿钠,不可重復(fù)讀
巢钓,幻讀
。 - **讀已提交(read commited) : ** 只允許讀取已經(jīng)被其他事務(wù)提交的變更疗垛≈⑿冢可以避免臟讀,可能出現(xiàn)的問題:
不可重復(fù)讀
继谚,幻讀
烈菌。 - **可重復(fù)度(repeatable read) : ** 確保事務(wù)可以從多個從一個字段中讀取相同的值阵幸。在這個事務(wù)持續(xù)期間花履,禁止其他事務(wù)對這個字段進(jìn)行更新≈可蓿可能出現(xiàn)的問題
幻讀
诡壁。 - **串行化(serializable) : ** 確保事務(wù)可以總一個表中讀取相同的行。在這個事務(wù)持續(xù)期間荠割,禁止其他事務(wù)對該表執(zhí)行插入妹卿,更新和刪除操作。雖然可以避免所有并發(fā)問題但是性能低下蔑鹦。