事務(wù)

1. 為什么要有事務(wù)

事務(wù)廣泛的運(yùn)用于訂單系統(tǒng)、銀行系統(tǒng)等多種場(chǎng)景

例如:

A用戶和B用戶是銀行的儲(chǔ)戶,現(xiàn)在A要給B轉(zhuǎn)賬500元,那么需要做以下幾件事:

  1. 檢查A的賬戶余額>500元;
  2. A 賬戶中扣除500元;
  3. B 賬戶中增加500元;

正常的流程走下來(lái),A賬戶扣了500,B賬戶加了500,皆大歡喜。

那如果A賬戶扣了錢(qián)之后,系統(tǒng)出故障了呢?A白白損失了500,而B(niǎo)也沒(méi)有收到本該屬于他的500。

以上的案例中,隱藏著一個(gè)前提條件:A扣錢(qián)和B加錢(qián),要么同時(shí)成功,要么同時(shí)失敗。事務(wù)的需求就在于此

所謂事務(wù),它是一個(gè)操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個(gè)不可分割的工作單位。

例如,銀行轉(zhuǎn)帳工作:從一個(gè)帳號(hào)扣款并使另一個(gè)帳號(hào)增款,這兩個(gè)操作要么都執(zhí)行,要么都不執(zhí)行。所以,應(yīng)該把他們看成一個(gè)事務(wù)。事務(wù)是數(shù)據(jù)庫(kù)維護(hù)數(shù)據(jù)一致性的單位,在每個(gè)事務(wù)結(jié)束時(shí),都能保持?jǐn)?shù)據(jù)一致性

事務(wù)四大特性(簡(jiǎn)稱ACID)

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔離性(Isolation)
  • 持久性(Durability)

以下內(nèi)容出自《高性能MySQL》第三版,了解事務(wù)的ACID及四種隔離級(jí)有助于我們更好的理解事務(wù)運(yùn)作。

下面舉一個(gè)銀行應(yīng)用是解釋事務(wù)必要性的一個(gè)經(jīng)典例子。假如一個(gè)銀行的數(shù)據(jù)庫(kù)有兩張表:支票表(checking)和儲(chǔ)蓄表(savings)?,F(xiàn)在要從用戶Jane的支票賬戶轉(zhuǎn)移200美元到她的儲(chǔ)蓄賬戶,那么至少需要三個(gè)步驟:

  1. 檢查支票賬戶的余額高于或者等于200美元。
  2. 從支票賬戶余額中減去200美元。
  3. 在儲(chǔ)蓄帳戶余額中增加200美元。

上述三個(gè)步驟的操作必須打包在一個(gè)事務(wù)中,任何一個(gè)步驟失敗,則必須回滾所有的步驟。

可以用START TRANSACTION語(yǔ)句開(kāi)始一個(gè)事務(wù),然后要么使用COMMIT提交將修改的數(shù)據(jù)持久保存,要么使用ROLLBACK撤銷(xiāo)所有的修改。事務(wù)SQL的樣本如下:

  1. start transaction;
  2. select balance from checking where customer_id = 10233276;
  3. update checking set balance = balance - 200.00 where customer_id = 10233276;
  4. update savings set balance = balance + 200.00 where customer_id = 10233276;
  5. commit;

一個(gè)很好的事務(wù)處理系統(tǒng),必須具備這些標(biāo)準(zhǔn)特性:

  • 原子性(atomicity)

一個(gè)事務(wù)必須被視為一個(gè)不可分割的最小工作單元,整個(gè)事務(wù)中的所有操作要么全部提交成功,要么全部失敗回滾,對(duì)于一個(gè)事務(wù)來(lái)說(shuō),不可能只執(zhí)行其中的一部分操作,這就是事務(wù)的原子性

  • 一致性(consistency)

數(shù)據(jù)庫(kù)總是從一個(gè)一致性的狀態(tài)轉(zhuǎn)換到另一個(gè)一致性的狀態(tài)。(在前面的例子中,一致性確保了,即使在執(zhí)行第三、四條語(yǔ)句之間時(shí)系統(tǒng)崩潰,支票賬戶中也不會(huì)損失200美元,因?yàn)槭聞?wù)最終沒(méi)有提交,所以事務(wù)中所做的修改也不會(huì)保存到數(shù)據(jù)庫(kù)中。)

  • 隔離性(isolation)

通常來(lái)說(shuō),一個(gè)事務(wù)所做的修改在最終提交以前,對(duì)其他事務(wù)是不可見(jiàn)的。(在前面的例子中,當(dāng)執(zhí)行完第三條語(yǔ)句、第四條語(yǔ)句還未開(kāi)始時(shí),此時(shí)有另外的一個(gè)賬戶匯總程序開(kāi)始運(yùn)行,則其看到支票帳戶的余額并沒(méi)有被減去200美元。)

  • 持久性(durability)

一旦事務(wù)提交,則其所做的修改會(huì)永久保存到數(shù)據(jù)庫(kù)。(此時(shí)即使系統(tǒng)崩潰,修改的數(shù)據(jù)也不會(huì)丟失。)

事務(wù)命令

表的引擎類型必須是innodb類型才可以使用事務(wù),這是mysql表的默認(rèn)引擎

查看表的創(chuàng)建語(yǔ)句,可以看到engine=innodb

-- 選擇數(shù)據(jù)庫(kù)
use jing_dong;
-- 查看goods表
show create table goods;

開(kāi)啟事務(wù),命令如下:

  • 開(kāi)啟事務(wù)后執(zhí)行修改命令,變更會(huì)維護(hù)到本地緩存中,而不維護(hù)到物理表中
begin;
或者
start transaction;

提交事務(wù),命令如下

  • 將緩存中的數(shù)據(jù)變更維護(hù)到物理表中
commit;

回滾事務(wù),命令如下:

  • 放棄緩存中變更的數(shù)據(jù)
rollback;

注意

  1. 修改數(shù)據(jù)的命令會(huì)自動(dòng)的觸發(fā)事務(wù),包括 insert、update、delete
  2. 而在SQL語(yǔ)句中有手動(dòng)開(kāi)啟事務(wù)的原因是: 可以進(jìn)行多次數(shù)據(jù)的修改,如果成功一起成功,否則一起會(huì)滾到之前的數(shù)據(jù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 視圖(一般只針對(duì)查詢) 1. 問(wèn)題 對(duì)于復(fù)雜的查詢,往往是有多個(gè)數(shù)據(jù)表進(jìn)行關(guān)聯(lián)查詢而得到,如果數(shù)據(jù)庫(kù)因?yàn)樾枨蟮仍?..
    強(qiáng)某某閱讀 895評(píng)論 0 0
  • 為什么要有事務(wù)事務(wù)廣泛的運(yùn)用于訂單系統(tǒng)、銀行系統(tǒng)等多種場(chǎng)景 例如: A用戶和B用戶是銀行的儲(chǔ)戶,現(xiàn)在A要給B轉(zhuǎn)賬5...
    大石兄閱讀 674評(píng)論 0 9
  • 事務(wù) 1. 為什么要有事務(wù) 事務(wù)廣泛的運(yùn)用于訂單系統(tǒng)、銀行系統(tǒng)等多種場(chǎng)景 例如: A用戶和B用戶是銀行的儲(chǔ)戶,現(xiàn)在...
    奇遇Python閱讀 106評(píng)論 0 2
  • 事務(wù) 1. 為什么要有事務(wù) 事務(wù)廣泛的運(yùn)用于訂單系統(tǒng)、銀行系統(tǒng)等多種場(chǎng)景 例如: A用戶和B用戶是銀行的儲(chǔ)戶,現(xiàn)在...
    Carver_閱讀 104評(píng)論 0 0
  • 我沒(méi)有很想你我只是在早上醒來(lái)的時(shí)候,看看手機(jī),有沒(méi)有你發(fā)來(lái)的信息,有沒(méi)有你的未接來(lái)電。 我沒(méi)有很想你我只是在上網(wǎng)的...
    夏末淺笑閱讀 295評(píng)論 0 0

友情鏈接更多精彩內(nèi)容