SQLServer事务

事务是实现原子性的手段,原子性是指某些事情要么全部发生,要么都不发生,我们都知道,程序的执行是有顺序的,在程序的执行过程中,难免会出现错误,如果对于某些必须作为原子性事务发生的事,在执行过程中,有一部执行了,还有另外一部分由于某种错误而没有执行,就会出现大麻烦。大部分的数据库书都会举这个例子,如果Alina在她的帐号A上取走了1000元,存在帐号B上,我们一般都会这么写

update checking set A=A-1000 where CountName='Alina'

update saving set B=B+1000 where CountName='Alina'

但如果第一条语句执行了,而第二条没有执行,那么就会有问题了,我们现在希望这两条语句要么都执行,要么都不执行,这就要用到事务了。

下面我就举一个小例子帮大家理解一下。

首先我们来建一个测试表

create table MyTranTest (    OrderID int primary key identity )

现在我们写一些代码来测试一下 begin tran TranStart insert into MyTranTest default values save tran FirstPoint insert into MyTranTest default values rollback tran FirstPoint insert into MyTranTest default values save tran SecondPoint insert into MyTranTest default values rollback tran SecondPoint insert into MyTranTest default values commit tran TranStart

然后我们在使用 select * from MyTranTest

结果如下:

也许你就会纳闷了,明明是五条Insert语句,怎么只执行了三条。

那我们就一起看一下吧

begin tran TranStart

现在是开始事务的时候,这开始了“要么全部,要么全不”的语句组合,然后是Insert一行,在这个结合点,只有一条语句被插入,下一步创建一个保存点,名为FirstPoint,然后在插入另一行,在这时已经有两行被插入了,但记住,他们都尚未被提交,因此数据库并不把他们作为数据库的一部分。

接下来是Rollback操作,说明白一点,并不是回滚到起始点,而是回滚到FirstPoint。通过这次回滚,在进行Rollback时刻和FirstPoint保存点之间的每件事情都被撤销。现在你应该明白了表中为什么只有三条数据了吧,下面的两个过程跟上面的一样,最后我们调用Committed tran语句,他锁住我们的事务,让他成为数据库历史的永久部分。

原文地址:https://www.cnblogs.com/mingjian/p/3428371.html