最近开发中遇到了使用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,是能够用来达到一些事务嵌套特性的。数据