在mysql中,事務(wù)是一系列操作的集合,這些操作要么全部執(zhí)行成功,要么全部失敗回退。此外,mysql也支持嵌套事務(wù)。
嵌套事務(wù)可以被看作是在一個事務(wù)中開啟了另一個事務(wù)。如果內(nèi)部事務(wù)成功提交,那么外部事務(wù)才能提交;如果內(nèi)部事務(wù)回滾,則整個事務(wù)鏈也將回滾。
為了使用嵌套事務(wù),需要在mysql中啟用XA(分布式事務(wù))協(xié)議,也需要支持InnoDB存儲引擎。
--在mysql中啟用XA協(xié)議 SET GLOBAL transaction_enalbed='ON'; SET @@global.transaction_isolation='READ-COMMITTED';
--支持InnoDB存儲引擎 CREATE TABLE test_table ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, data VARCHAR(100) ) ENGINE=InnoDB;
通過使用SAVEPOINT和ROLLBACK TO來實現(xiàn)事務(wù)的嵌套管理:
--定義一個事務(wù),包含兩個子事務(wù) START TRANSACTION; SAVEPOINT sub1; INSERT INTO test_table (data) VALUES ('subtransaction 1'); ROLLBACK TO sub1; SAVEPOINT sub2; INSERT INTO test_table (data) VALUES ('subtransaction 2'); COMMIT; ROLLBACK;
在上面的例子中,我們定義了一個包含兩個子事務(wù)的事務(wù)。如果sub1事務(wù)回滾,sub2和主事務(wù)都將回滾。如果sub2事務(wù)成功提交,整個事務(wù)鏈將最終提交。