MySQL 到底支不支持事務嵌套

最近開發中遇到了使用MySQL,多次開啓事務,出現了數據錯亂問題,僞代碼如下:

begin;

# 操作1

begin;

# 操作2

rollback;

執行完後出現了操作1的數據真正寫入,只有操作2的數據回滾了。在第一個事務沒有提交或回滾時,再開啓第二個事務時,會自動提交第一個事務。

這明顯不符合心理預期,而且也無法回滾一部分操作。那麼問題來了,MySQL 支不支持事務嵌套呢?

這個問題很難準確回答支持還是不支持!

首先,調用多次begin的寫法,在MySQL裏肯定是無法首先事務嵌套的。經過羣內一位朋友的提醒,瞭解到MySQL中有一個叫savepoint和rollback to的語句。

示例代碼:

DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

begin;

insert into `test`(`name`) values('111');

SAVEPOINT p1;

insert into `test`(`name`) values('222');

ROLLBACK TO p1;

commit;

最終執行結果,test表中只有111這個數據,實現了部分操作的回滾操作。同理也避免了多次開啓事務,導致前一個事務被提交的問題。

可能savepoint和rollback to語句並不能稱之爲事務嵌套,也不能說MySQL是支持還是不支持事務嵌套。總之通過savepoint和rollback to,是可以用來達到一些事務嵌套特性的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章