测试数据库: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