新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创新互联是一家专注于成都做网站、成都网站设计与策划设计,当雄网站建设哪家好?创新互联做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:当雄等地区。当雄做网站价格咨询:18980820575>一个事物中包括 添加数据(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事物不太了解。