您的位置:首页 > 数据库 > MySQL

MYSQL DDL语句 与 DML 在一个事物中的问题。

2013-04-26 16:21 295 查看
一个事物中包括 添加数据(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事物不太了解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: