您的位置:首页 > 其它

数据事物嵌套实验和结论

2011-09-14 11:06 169 查看
测试数据库:Mysql InnoDB 目标数据库表student(id,int; name,varchar)
SQL组合1
start transaction;
start transaction;
insert into student values(1,"hello,world");
commit;
insert into student values(2,"goodbye,world");
rollback;

缺省的mysql运行在autocommit模式,如果不修改缺省模式的话,意味着,当执行一个更新时候mysql都立刻将更新存储到磁盘上,所以,缺省模式下,该条语句执行结果是:两条数据全部插入,下面的实验全部在非缺省模式下操作
SET AUTOCOMMIT=0;

结果:
命令行下:直插入了id=1的这套记录
Qt下:插入了两条记录,说明我们的Qt事物操作,如果出现嵌套,需要执行SET AUTOCOMMIT=0操作,否则就会出现两条记录都插入的情况,当在Qt里面执行了SET AUTOCOMMIT=0操作后,只插入了第一条记录。

SQL组合2
start transaction;
start transaction;
insert into student values(1,"hello,world");
rollback;
insert into student values(2,"goodbye,world");
commit;

结果:
命令行下:非缺省模式下,插入id=2这条记录
Qt下:同命令行下一样

SQL组合3
start transaction;
insert into student values(2,"goodbye,world");
start transaction;
insert into student values(1,"hello,world");
rollback;
commit;

命令行下:非缺省模式下,插入id=2这条记录
Qt下:同命令行下一样
缺省模式和非缺省模式一样,和组合1比较,似乎可以得到结论三

SQL组合4
start transaction;
insert into student values(2,"goodbye,world");
start transaction;
insert into student values(1,"hello,world");
commit;
rollback;

命令行下:非缺省模式下,两条记录全部插入
Qt下:同命令行下一样

结论
第一:外层事物的提交或者回滚,对内层事物不影响。
第二:内层事物的提交,会把内层和外层所有的事物全部提交,即对外层事物有影响,会结束外层事物,使其回滚无效。
第三:内层事物的回滚,不影响外层事物。无论是在缺省模式还是非缺省模式

也许不同的数据库结果不一样,或者不同的数据库引擎不一样,没有测试其他的。

~~thankyou
本文出自 “xiesiyuana的博客” 博客,请务必保留此出处http://seanyxie.blog.51cto.com/1319339/1375881
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: