在学到事务时,练习的时候发现了,在隐式事务状态下,事务可以回滚。
例:在一个学生表里有三条数据如下
首先查看数据库中是否有事务开启
select @@TRANCOUNT ---执行后显示如下
这个0就是显示的当前状态下无事务
然后我们开启隐式事务 set implicit_transactions on;---这时要注意的是当前状态下也是显示无事务
---这是要注意的地方,为何开启隐式事务后还是显示的0 呢?因为虽然开启了事务,但是要执行一条任何语句后系统才会认为已经开始事务了,不然没有执行语句时一直显示的是0事务。
例如,我们查询表数据,执行后,再利用select @@TRANCOUNT;--执行后显示如下,这时才是真正在隐式事务下了
这时我们往表里插入一条数据insert into student values(004,'ces',30)显示如下
我们用roolback transaction;查看是否会回滚,查询表后显示如下,证明是可以回滚的。
还要注意的是,如果在隐式事务状态下插入多条数据,然后再roolback,的话会回滚到初始状态,也就是不管你插入几条数据都会被删掉。不信的人可以做实验试试看。
那作为对比,我们也做一下在显示事务状态下利用roolback是否有用,同样的是往数据表里插入数据
begin transaction sqq--sqq为给事务取个名字
insert into student values(005,'cesff',20)
commit transaction;---执行后结果
这时我们用roolback执行后看下结果,说明这时利用roolback时无效的。我们的数据已经插入数据库中无法回滚了。
这时我好奇,想试试在显示事务中利用select @@trancount,是什么样的结果,结果显示还是无事务,说明显示事务状态下系统不显示事务数。
该实验是我的个人总结,新手,对这些不是很了解,如果有人看到此文,认为我的实验是错误的,或者对事务有别的理解请及时纠正我。也希望跟大家一起探讨。