shell中执行某条语句失败能不能重复执行_如何理解Mysql中的事务隔离级别?
要說清楚Mysql中的事務(wù)隔離級(jí)別,我們先從事務(wù)的定義說起。事務(wù),是一個(gè)或一組sql語句組成的一個(gè)執(zhí)行單元,這個(gè)執(zhí)行單元要么全部執(zhí)行,要么全部不執(zhí)行。整個(gè)單獨(dú)單元作為一個(gè)不可分割的整體,如果單元中某條sql語句一旦執(zhí)行失敗或產(chǎn)生錯(cuò)誤,整個(gè)單元將會(huì)回滾。所有收到影響的數(shù)據(jù)將返回到事務(wù)開始以前的狀態(tài);如果單元中的所有sql語句均執(zhí)行成功,則事務(wù)被順利執(zhí)行。
事務(wù)有4個(gè)屬性,即ACID屬性
1. 原子性(Atomicity)
原子性是指事務(wù)是一個(gè)不可分割的工作單元,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
2. 一致性(Consistency)
事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另一個(gè)一致性狀態(tài)。
3. 隔離性(Isolation)
事務(wù)的隔離性是指一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
4. 持久性(Durability)
持久性是指一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來的其他操作和數(shù)據(jù)庫故障不應(yīng)該對(duì)其有任何影響。
對(duì)于同時(shí)運(yùn)行的多個(gè)事務(wù),當(dāng)這些事務(wù)訪問數(shù)據(jù)庫中相同的數(shù)據(jù)時(shí),會(huì)有可能發(fā)生一下的問題:
臟讀:對(duì)于兩個(gè)事務(wù)T1、T2,T1讀取了已經(jīng)被T2更新但還未提交的字段,若T2回滾,T1讀取的內(nèi)容就是臨時(shí)且無效的。
不可重復(fù)度:對(duì)于兩個(gè)事務(wù)T1、T2,T1讀取了一個(gè)字段,然后T2更新了該字段之后, T1再次讀取同一個(gè)字段,值就不同了。
幻讀:對(duì)于兩個(gè)事務(wù)T1、T2,T1從表中讀取了一個(gè)字段,然后T2在該表中插入了一些新的行之后,如果T1再次讀取同一個(gè)表,就會(huì)多出幾行。
因此,Mysql定義了四種隔離級(jí)別,分別解決以上發(fā)生的問題。好,我們通過例子來分別演示著4種隔離級(jí)別。
一個(gè)事務(wù)包括開始事務(wù)、執(zhí)行事務(wù)、結(jié)束事務(wù)
開啟事務(wù):set auto committed = 0
結(jié)束事務(wù):commit/rollback
執(zhí)行事務(wù):一串sql語句。
假設(shè)原始表為:
讀未提交:允許事務(wù)讀取未被其他事務(wù)提交的變更,臟讀、不可重復(fù)讀和幻讀的問題都會(huì)出現(xiàn)。
用戶A:
用戶B:
此時(shí)B在臟讀。
讀已提交:只允許事務(wù)讀取已經(jīng)被其他事務(wù)提交的變更,可以避免臟讀,但不可重讀和幻讀問題仍然可能出現(xiàn)。
用戶A:
用戶B:
此時(shí)B只讀已提交的數(shù)據(jù),但是用戶A提交了,B再讀一次的數(shù)據(jù)和上一次不一致,不可重復(fù)讀的問題依然存在。
可重復(fù)讀:確保事務(wù)可多次從一個(gè)字段中讀取相同的值。但幻讀問題依然存在。
用戶A:
用戶B:
此時(shí)B讀取的兩次數(shù)據(jù)都一致,說明可重復(fù)讀。
串行化:在事務(wù)持續(xù)期間,禁止其他事務(wù)對(duì)該表進(jìn)行插入、更新和刪除,所有問題都可以避免,但性能十分地下。
總結(jié)
以上是生活随笔為你收集整理的shell中执行某条语句失败能不能重复执行_如何理解Mysql中的事务隔离级别?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: discuz search.php修改,
- 下一篇: 怎么开通手机信息服务器,如何用手机建立网