首页新闻找找看学习计划

MySQL 事务commit

0
悬赏园豆:10 [待解决问题]

  我们都知道,事务的开始一般声明为:

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记录没有插进去。

谁能告诉我这是为什么吗?应该怎么写呢?

mcfer的主页 mcfer | 初学一级 | 园豆:144
提问于:2015-06-09 01:08
< >
分享
所有回答(3)
0

没有人知道吗?

mcfer | 园豆:144 (初学一级) | 2015-06-09 09:22
0

需要回滚RollBack事务,MySQL事务的标准写法参考 http://dev.mysql.com/doc/refman/5.0/en/commit.html

JeffWong | 园豆:2021 (老鸟四级) | 2015-06-09 09:31

谢谢你,解决了我大部分的疑问。但是我怎么知道什么时候执行rollback呢?

支持(0) 反对(0) mcfer | 园豆:144 (初学一级) | 2015-06-09 09:50

@mcfer: 事务执行出问题,自动就走rollback这个分支了

支持(0) 反对(0) JeffWong | 园豆:2021 (老鸟四级) | 2015-06-09 10:09

@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;

结果是第一条语句执行成功了,但是第二条确失败了,所以是没有回滚第一条的

支持(0) 反对(0) mcfer | 园豆:144 (初学一级) | 2015-06-09 10:12

@mcfer: rollback你需要显式写出来

insert into Student(id,name,department) values (1,"xiaoming2,"computer science");
  
if row_count() < 2 then    

    rollback;  
支持(0) 反对(0) JeffWong | 园豆:2021 (老鸟四级) | 2015-06-09 12:18
0
mysql> SHOW VARIABLES LIKE '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql>

 

你可以看下你的配置,是否设置了自动提交。如果是ON,你可以设置为OFF再次实验。

艾森豪威迩 | 园豆:210 (菜鸟二级) | 2015-06-23 18:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册