一个事物中包括 添加数据(DML) 和 建表(DDL) 两个操作。当添加数据完成的时候,DDL语句报错,异常回滚。但是此时DML语句已经执行成功并提交。
疑惑DML语句为什么没有回滚。
因为是用的hibernate,所以开始怀疑hibernate的问题。后来细细研究了下,表示hibernate很无辜。
用MYSQL作了一些测试,如下:
set autocommit = 0;#开启手动提交事务 begin;#事物开始 INSERT INTO `employee` (`first_name`, `last_name`, `job_title`, `salary`) VALUES ('汉子', 'Gilbert', 'Software Architect', 8000);#向employee表添加数据,此表数据库中已存在的。 #重复创建employee表,此建表语句会报错 CREATE TABLE `employee` ( `id` int NOT NULL AUTO_INCREMENT, `first_name` varchar(100) NOT NULL, `last_name` varchar(100) NOT NULL, `job_title` varchar(100) DEFAULT NULL, `salary` double DEFAULT NULL, `notes` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ROLLBACK;#事物结束,回滚。 #为了更加明显突出问题,此处我用回滚。其实在这里无论提交回滚。数据已经添加成功
此时我怀疑DDL语句与DML语句不能处于同一事物,但是只是怀疑。
一系列查资料,但是并未出现一个明显的答案。所以这个问题并未完全弄明白。也求大神解释.....
但是,发现一个很重要的信息:
一些命令,当开始一个事物,在执行之前,MySQL会自动提交事物。这些命令就是DDL。
从上面理解到,DDL命令会单独开启一个事物,并且会提交之前的事物。所以在我建表的时候,DDL命令已经把我添加数据事物给提交了。
到我理解极限了,对mysql事物不太了解。
浙公网安备 33010602011771号