我们都知道,事务的开始一般声明为:
start transaction;
事务的结束一般声明为:
commit/rollback
那么问题来了。
在一个存储过程中这样写:
begin start transaction; insert into Student (name,department) values ("xiaoming","computer science"); insert into Student(id,name,department) values (1,"xiaoming2,"computer science"); //这句sql是错误的,因为Student表的主键为id,并且数据库中已经存在了id为1的记录行。 commit; end
按道理说,事务具有原子性,xiaoming这条记录也会插不进去,但是事实却是xiaoming插进去了,xiaoming2记录没有插进去。
谁能告诉我这是为什么吗?应该怎么写呢?
没有人知道吗?
需要回滚RollBack事务,MySQL事务的标准写法参考 http://dev.mysql.com/doc/refman/5.0/en/commit.html
谢谢你,解决了我大部分的疑问。但是我怎么知道什么时候执行rollback呢?
@mcfer: 事务执行出问题,自动就走rollback这个分支了
@JeffWong: 事实上不是这样的哦。
下面的语句的:
start transaction; insert into Student (name,department) values ("xiaoming","computer science"); insert into Student(id,name,department) values (1,"xiaoming2,"computer science"); //这句sql是错误的,因为Student表的主键为id,并且数据库中已经存在了id为1的记录行。 commit;
结果是第一条语句执行成功了,但是第二条确失败了,所以是没有回滚第一条的
@mcfer: rollback你需要显式写出来
insert into Student(id,name,department) values (1,"xiaoming2,"computer science"); if row_count() < 2 then rollback;
mysql> SHOW VARIABLES LIKE '%autocommit%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql>
你可以看下你的配置,是否设置了自动提交。如果是ON,你可以设置为OFF再次实验。