MySQL 數(shù)據(jù)庫(kù)的事務(wù)
我們之前分享數(shù)據(jù)庫(kù)的數(shù)據(jù)操作,無(wú)外乎對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行增、刪、改、查。就比如我們?nèi)ベI(mǎi)東西,一般都是先付錢(qián),賣家收到錢(qián)再發(fā)貨。這個(gè)用數(shù)據(jù)庫(kù)來(lái)表示就是,第一步:從用戶的賬戶中減去一部分金額。第二步,再把減去的金額添加到商家的賬戶上。
但是萬(wàn)一遇到特殊的情況,你成功的完成了第一步,從用戶的數(shù)據(jù)庫(kù)中扣除了錢(qián),這時(shí)候突然停電,系統(tǒng)出現(xiàn)了故障,沒(méi)有完成第二步。這就尷尬了,用戶的錢(qián)少了,商家也沒(méi)收到錢(qián)。
為了應(yīng)對(duì)這種情況的發(fā)生,數(shù)據(jù)庫(kù)就出現(xiàn)了一個(gè)功能事務(wù),事務(wù)就是一組由 SQL 語(yǔ)句組成的業(yè)務(wù)邏輯,當(dāng)事務(wù)內(nèi)的所有 SQL語(yǔ)句都成功的執(zhí)行,整個(gè)事務(wù)才算成功,否則就是失敗。失敗意味著整個(gè)的數(shù)據(jù)操作沒(méi)有意義,就要把數(shù)據(jù)恢復(fù)到執(zhí)行事務(wù)操作之前的狀態(tài)。
上面是關(guān)于事務(wù)的介紹,下面我們用具體的代碼演示一下:
SQL語(yǔ)句在執(zhí)行的過(guò)程中分為二個(gè)階段:
1 : 執(zhí)行SQL語(yǔ)句
2 : 將執(zhí)行結(jié)果提交給數(shù)據(jù)庫(kù)。
現(xiàn)在我們來(lái)演示一下:修改 id=3 的用戶的手機(jī)號(hào)碼,使之變成 123456
我們看見(jiàn)這個(gè)修改操作已經(jīng)完成了,我們來(lái)看一下事務(wù)默認(rèn)的執(zhí)行方式。
show variables like 'autocommit';
事務(wù)默認(rèn)的執(zhí)行方式:自動(dòng)提交。SQL語(yǔ)句執(zhí)行完畢后,自動(dòng)提交事務(wù)。
事務(wù)的功能演示
先來(lái)創(chuàng)建兩個(gè)表一個(gè)用戶表一個(gè)訂單表,寫(xiě)入兩條數(shù)據(jù)。
查看一下表內(nèi)的數(shù)據(jù)。
現(xiàn)在我們來(lái)開(kāi)啟事務(wù):start translation。
我們打開(kāi)一個(gè)窗口,作為一個(gè)新的用戶,現(xiàn)在我們看見(jiàn),數(shù)據(jù)是沒(méi)有變化的。也就是說(shuō),當(dāng)一個(gè)事務(wù)沒(méi)有完成的時(shí)候,用戶只能看到事務(wù)完成前,或者完成后的狀態(tài)。
現(xiàn)在我們的操作完成,來(lái)提交事務(wù)。commit
數(shù)據(jù)庫(kù)中的數(shù)據(jù)修改了,別的用戶查看數(shù)據(jù)庫(kù)的時(shí)候,也是修改后的數(shù)據(jù)。如果執(zhí)行的過(guò)程中發(fā)生錯(cuò)誤呢?開(kāi)啟事務(wù)。再來(lái)修改一下數(shù)據(jù)。
現(xiàn)在出錯(cuò)了,事務(wù)進(jìn)行回滾操作,rollback。
我們看到了,數(shù)據(jù)庫(kù)的數(shù)據(jù)恢復(fù)到?jīng)]有修改之前的狀態(tài)。這就是我們今天要分享的 MySQL 數(shù)據(jù)庫(kù)的事務(wù)了。
想要資料的小伙伴
可以在公眾號(hào)中回復(fù)
“資料”
那里有娜娜已經(jīng)準(zhǔn)備好的
一份學(xué)習(xí)資料
拜拜~