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