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语句,他锁住我们的事务,让他成为数据库历史的永久部分。