MYSQL--事务隔离
你在銀行存了100元,現(xiàn)在你要把100元轉(zhuǎn)給用戶A,銀行一查你還有錢,開始給A轉(zhuǎn)錢,這時,轉(zhuǎn)錢給A的操作還未完成,你又把錢轉(zhuǎn)給B,銀行一看,你銀行賬號還有錢,就又給B轉(zhuǎn)錢。那亂套了....銀行血虧
所以把你轉(zhuǎn)給A,轉(zhuǎn)給B這兩件事分為兩個事務(wù)。
事務(wù)可以保證在事務(wù)中所有的數(shù)據(jù)庫操作要么全部成功,要么全部失敗。
事務(wù)的特性,即ACID(原子性,一致性,隔離性,持久性),這篇文章就來聊一聊隔離性。
多個事務(wù)同時執(zhí)行時,可能出現(xiàn)臟讀,不可重復(fù)讀,幻讀,為了解決這些問題,出現(xiàn)了“隔離級別”
SQL標(biāo)準(zhǔn)的隔離級別分為:讀未提交,讀提交,可重復(fù)讀,串行化
讀未提交:別人未提交,我也能看到
讀提交:別人提交了,我才能看到
可重復(fù)讀:別人提交了,我也不看
串行化:我沒改完,誰也看不見
在實現(xiàn)上,數(shù)據(jù)庫里面會創(chuàng)建一個視圖,訪問時以視圖的邏輯結(jié)果為準(zhǔn)。
在“可重復(fù)讀”隔離級別下,視圖在事務(wù)創(chuàng)建時建立,整個事務(wù)存在期間都用這個視圖。
在“讀提交”隔離級別下,視圖是在每個SQL語句開始執(zhí)行的時候開始創(chuàng)建的。
“讀未提交”隔離級別下,直接返回記錄上的最新值。
“串行化”隔離級別下,直接用加鎖的方式來避免并行訪問。
可重復(fù)讀的場景適用于哪些范圍?
比如你有一個賬戶余額表,一個賬單明細,你在對比看是否與本月賬單一致時一定不希望有新的交易發(fā)生影響你,這個時候用“可重復(fù)讀”,可以默認事務(wù)是靜態(tài)的
事務(wù)隔離 的實現(xiàn):
在MYSQL中,每條記錄在更新的時候都會同時記錄一條回滾操作。通過回滾操作,可以得到前一個狀態(tài)的值。
比如1+1,變?yōu)?,繼續(xù)2+1變?yōu)?,再3+1變?yōu)?
從4開始回滾,可以得到1,2,4幾個值,同一條記錄在系統(tǒng)中存在多個版本,這就是多版本并發(fā)控制(MVCC)
回滾日志也不能一直保留,什么時候刪除呢?
系統(tǒng)會判斷,當(dāng)沒有事務(wù)需要用到這些回滾日志時,回滾日志才刪除。
什么時候不需要呢?
當(dāng)系統(tǒng)里沒有比這個回滾日志更早的read-view的時候。
回滾段可能非常耗費資源,所以盡可能避免使用長事務(wù)
長事務(wù):長時間未提交的事務(wù)
事務(wù)的啟動方式:
1.顯示啟動事務(wù)語句,begin或者start transaction,配套的提交語句是commit,回滾語句是rollback
2. set autocommit=0,這個命令將自動提交關(guān)閉。意味著執(zhí)行SQL語句,事務(wù)啟動,不會自動提交。這個事務(wù)持續(xù)到你主動執(zhí)行
commit或者rollback語句,或者斷開連接。
有的框架建立連接后,會默認執(zhí)行 set autocommit=0,就導(dǎo)致了接下來的操作數(shù)據(jù)庫都在事務(wù)中,如果是長連接,就導(dǎo)致了長事務(wù)。
總結(jié)
以上是生活随笔為你收集整理的MYSQL--事务隔离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一章 计算机网络 2 组成与分类 [计
- 下一篇: 再会迪杰斯特拉(Dijkstra)