事務(wù)處理是一種對(duì)必須整批執(zhí)行的 MySQL 操作的管理機(jī)制,在事務(wù)過(guò)程中,除非整批操作全部正確執(zhí)行,否則中間的任何一個(gè)操作出錯(cuò),都會(huì)回滾 (Rollback) 到最初的安全狀態(tài)以確保不會(huì)對(duì)系統(tǒng)數(shù)據(jù)造成錯(cuò)誤的改動(dòng)。
之前的文章中我們提到過(guò),MySQL 5.5 之后,默認(rèn)的存儲(chǔ)引擎從 MyISAM 替換成了 InnoDB,這其中的一個(gè)重要原因就是因?yàn)?InnoDB 支持事務(wù),我們用 SHOW ENGINES 來(lái)看一下 MySQL 中對(duì)各種存儲(chǔ)引擎的描述。
事務(wù)控制語(yǔ)法
MySQL 事務(wù)控制有幾個(gè)重要節(jié)點(diǎn),分別是事務(wù)的開(kāi)啟,提交,回滾和保存點(diǎn)。
UPDATE account_balance SET balance = balance - 100.00 WHERE account_name = 'A';
UPDATE account_balance SET balance = balance + 100.00 WHERE account_name = 'B';
COMMIT; # 提交事務(wù) // 發(fā)生異常,回滾
BEGIN; # 開(kāi)啟事務(wù)
UPDATE account_balance SET balance = balance - 100.00 WHERE account_name = 'A';
UPDATE account_balance SET balance = balance + 100.00 WHERE account_name = 'B';
ROLLBACK; # 事務(wù)回滾
在復(fù)雜場(chǎng)景中,有時(shí)我們不需要全盤(pán)回滾整個(gè)操作,而是分批執(zhí)行,回滾到某個(gè)節(jié)點(diǎn)就好了,相當(dāng)于是在一個(gè)大事務(wù)下嵌套了若干個(gè)子事務(wù),在 MySQL 中可以使用保留點(diǎn) SAVEPOINT 來(lái)實(shí)現(xiàn)。