MySQL 到底支不支持事務嵌套?

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

begin;
 
# 操做1
 
begin;
 
# 操做2
 
rollback;

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

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

這個問題很難準確回答支持仍是不支持!開發

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

示例代碼:class

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這個數據,實現了部分操做的回滾操做。同理也避免了屢次開啓事務,致使前一個事務被提交的問題。test

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

相關文章
相關標籤/搜索