在本教學中,您將瞭解MySQL事務以及如何使用MySQL COMMIT
語句和MySQL ROLLBACK
語句來管理MySQL中的事務。
MySQL事務介紹
要瞭解MySQL中的事務是什麼,我們先來看看在示例資料庫(zaixiandb)中添加新的銷售訂單的示例。添加銷售訂單的步驟如下所述:
- 從
orders
表中查詢最新的銷售訂單編號,並使用下一個銷售訂單編號作為新的銷售訂單編號。 - 在指定客戶的
orders
表中插入新的銷售訂單。 - 將新的銷售訂單專案插入
orderdetails
表中。 - 從
orders
表和orderdetails
中獲取數據以確認更改。
現在想像如果由於資料庫故障而導致上述一個或多個步驟失敗,那麼數據會發生什麼? 如果將訂單項添加到orderdetails
表中的步驟失敗,系統中將會有空的銷售訂單(只有訂單號,不知道這個訂單賣了什麼)。數據可能不完整,那麼必須花費的精力來解決這個問題。
如何解決這個問題? 這就是為什麼事務來處理。 MySQL事務使您能夠執行一組MySQL操作,以確保資料庫從不包含部分操作的結果。 在一組操作中,如果其中一個失敗,則會恢復回滾資料庫。 如果沒有發生錯誤,則將整個語句集合提交到資料庫。
使用MySQL事務
在上述示例中,我們將使用它們添加銷售訂單之前,先來看看MySQL事務語句。
要啟動事務,請使用START TRANSACTION
語句。要撤銷MySQL語句執行,請使用ROLLBACK
語句。
請注意,有一些SQL語句,主要是數據定義語句,不能在事務中使用以下語句:
CREATE / ALTER / DROP DATABASE
CREATE /ALTER / DROP / RENAME / TRUNCATE TABLE
CREATE / DROP INDEX
CREATE / DROP EVENT
CREATE / DROP FUNCTION
CREATE / DROP PROCEDURE
…
要將更改寫入事務中的資料庫,請使用COMMIT
語句。要注意的是,默認情況下,MySQL自動提交對數據庫的更改。
要強制MySQL不會自動提交更改,請使用以下語句:
SET autocommit = 0
MySQL事務的例子
要使用MySQL事務,首先必須將MySQL語句分解成邏輯部分,並確定何時應該提交或回滾數據。
下麵來看一下使用MySQL事務在上面的示例資料庫中添加新的銷售訂單並添加事務處理步驟的例子:
- 使用START TRANSACTION語句啟動事務。
- 從
orders
表中獲取最新的銷售訂單編號,並使用下一個銷售訂單編號作為新的銷售訂單編號。 - 在指定
orders
表中插入新的銷售訂單。 - 將新的銷售訂單專案插入
orderdetails
表中。 - 使用
COMMIT
語句提交更改。 - 從
orders
表和orderdetails
表中獲取數據以確認更改。
以下是執行上述步驟的腳本:
-- start a new transaction
start transaction;
-- get latest order number
select @orderNumber := max(orderNUmber)
from orders;
-- set new order number
set @orderNumber = @orderNumber + 1;
-- insert a new order for customer 145
insert into orders(orderNumber,
orderDate,
requiredDate,
shippedDate,
status,
customerNumber)
values(@orderNumber,
now(),
date_add(now(), INTERVAL 5 DAY),
date_add(now(), INTERVAL 2 DAY),
'In Process',
145);
-- insert 2 order line items
insert into orderdetails(orderNumber,
productCode,
quantityOrdered,
priceEach,
orderLineNumber)
values(@orderNumber,'S18_1749', 30, '136', 1),
(@orderNumber,'S18_2248', 50, '55.09', 2);
-- commit changes
commit;
-- get the new inserted order
select * from orders a
inner join orderdetails b on a.ordernumber = b.ordernumber
where a.ordernumber = @ordernumber;
在本教學中,您學習了如何使用START TRANSACTION COMMI
和ROLLBACK
的MySQL事務語句來管理MySQL中的事務以保護數據完整性。