《MySQL—事務(wù)》要點(diǎn):
本文介紹了MySQL—事務(wù),希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
先來(lái)考慮一個(gè)實(shí)際的需求:
有一張“銀行賬戶表”,現(xiàn)在我要讓A用戶給B用戶轉(zhuǎn)賬.
此時(shí)正確的做法是:
A賬戶金額減少,B賬戶增加
此時(shí),出現(xiàn)了緊急情況,設(shè)備斷電,而斷電的時(shí)間恰恰很巧:
A賬戶金額減少之后,B賬戶金額增加之前,發(fā)生了斷電
因此,轉(zhuǎn)賬的金額就這么不知去向了
在“這個(gè)需求”中,我們面臨繼續(xù)辦理的問(wèn)題:
當(dāng)一系連續(xù)的操作因?yàn)槟承┰虮淮驍嘁院蟪霈F(xiàn)了數(shù)據(jù)庫(kù)的“紛歧致性”
“這個(gè)具體問(wèn)題”解決辦法是:
在一個(gè)單獨(dú)的空間中,先上A賬戶金額減少,但此時(shí)不修改表.再讓B賬戶金額增加,也不修改表.最后核對(duì)一下總金額與原表是否一樣,如果一樣則一次性修改表
事務(wù)機(jī)制是專門用來(lái)辦理上述問(wèn)題的數(shù)據(jù)庫(kù)機(jī)制,它可以保護(hù)相關(guān)聯(lián)的操作一起完成,或者一起失敗
針對(duì)的對(duì)象:一系列,連續(xù)且相關(guān)的操作
原子性:一系列連續(xù)且相關(guān)的操作必需同時(shí)成功或同時(shí)失敗
隔離性:當(dāng)一個(gè)事務(wù)操作了表中的一行,那么在這個(gè)事務(wù)結(jié)束前,該行不能由其余會(huì)話操作
意義:保證了數(shù)據(jù)庫(kù)的完整性和一致性
實(shí)現(xiàn):上述所描述的“單獨(dú)的空間”,其實(shí)是通過(guò)“事務(wù)日志”來(lái)實(shí)現(xiàn)的
為了能夠讓知識(shí)點(diǎn)直觀,我們通過(guò)代碼示例來(lái)演示“上述轉(zhuǎn)賬失敗的過(guò)程”
1、創(chuàng)建相應(yīng)的數(shù)據(jù)庫(kù)
Python學(xué)習(xí)交流群:330637182
2、創(chuàng)建相應(yīng)的表
Python學(xué)習(xí)交流群:330637182
3、插入相關(guān)數(shù)據(jù)
Python學(xué)習(xí)交流群:330637182
4、開始發(fā)工資(在沒(méi)有事務(wù)機(jī)制的掩護(hù)下發(fā)生了斷電)
Python學(xué)習(xí)交流群:330637182
5、再次進(jìn)入數(shù)據(jù)庫(kù),查詢相關(guān)的電子現(xiàn)金信息
Python學(xué)習(xí)交流群:330637182
id | account | name | balance |
---|---|---|---|
1 | 1111111111111111111 | Tuple | 100.00 |
2 | 0000000000000000000 | TanzhouEdu | 9992320.00 |
此時(shí)出現(xiàn)了無(wú)法解救的損失,電子現(xiàn)金消失了
自動(dòng)模式(默認(rèn))
心細(xì)的同學(xué)會(huì)發(fā)現(xiàn),默認(rèn)情況下,我們?nèi)绻騇ySQL發(fā)送一條修改數(shù)據(jù)庫(kù)的命令,命令執(zhí)行完成后會(huì)立即修改數(shù)據(jù)庫(kù)表.就像上述案例中的 UPDATE my_account SET balance=balance-7680 WHERE id=2; 一樣.
此時(shí),數(shù)據(jù)庫(kù)將每一條命令當(dāng)成一個(gè)單獨(dú)的事務(wù).
如果我們想要在“自動(dòng)模式”下,使用“事務(wù)”,那么我們必需使用如下幾個(gè)命令:
Python學(xué)習(xí)交流群:330637182
注意:一旦我們“提交”,或者“回滾”了事務(wù),那么就視為事務(wù)結(jié)束.在事務(wù)結(jié)束的情況下,再“提交”,或者“回滾”是沒(méi)有意義的
手動(dòng)模式
這次,我們?cè)凇笆聞?wù)自動(dòng)模式下”手動(dòng)開始一個(gè)事務(wù),并利用這個(gè)來(lái)完成我們轉(zhuǎn)賬的效果.
注意:為了保證演示效果,我們必要同時(shí)連接兩個(gè)MySQL終端(會(huì)話),分別為S1和S2.
Python學(xué)習(xí)交流群:330637182
1、在S1中,開啟自定義新事務(wù)
Python學(xué)習(xí)交流群:330637182
2、在S1中,開始發(fā)工資(暫時(shí)任然只做到停電前那一步)
Python學(xué)習(xí)交流群:330637182
但是我們?cè)赟2中查看金額
Python學(xué)習(xí)交流群:330637182
id | account | name | balance |
---|---|---|---|
1 | 1111111111111111111 | Tuple | 100.00 |
2 | 0000000000000000000 | TanzhouEdu | 9992320.00 |
發(fā)現(xiàn),在S2中并不克不及看到S1中所做的改變.
3、接下來(lái)我們把從潭州教育財(cái)務(wù)卡中拿出的金額給Tuple老師,并提交這一系列相關(guān)的操作
Python學(xué)習(xí)交流群:330637182
4、此時(shí)我們?cè)偈褂?/p>
Python學(xué)習(xí)交流群:330637182
id | account | name | balance |
---|---|---|---|
1 | 1111111111111111111 | Tuple | 7780.00 |
2 | 0000000000000000000 | TanzhouEdu | 9984640.00 |
我們發(fā)現(xiàn),此時(shí),S2才能看到這其中的修改,否則對(duì)S1的任何修改都弗成見.
這個(gè)過(guò)程中,只要我們“手動(dòng)開始了一個(gè)自定義新事務(wù)”,當(dāng)這個(gè)事務(wù)提交前,這個(gè)操作是放在“事務(wù)日志”中的,并不會(huì)真的影響到我們的數(shù)據(jù)庫(kù),只有當(dāng)我們提交的以后才會(huì)真的修改我們的數(shù)據(jù)表.
喜歡python或者想學(xué)習(xí)python的朋友可以加QQ群:330637182!群內(nèi)每天會(huì)更新python材料,還有大牛指導(dǎo)喲!
歡迎參與《MySQL—事務(wù)》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/7098.html