Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务。begin tran表示开始事务, commit tran表示提交事务,rollback tran表示回滚事物
用途:
一般把DML语句(delete,update,insert语句)放在BEGIN TRAN...COMMIT TRAN 之间作为一个事务处理
也就是那些语句执行过程中如果遇到错误,无论哪句遇到错误,所有语句都会回滚到BEGIN TRAN之前的状态。
例如你需要更新一个数据,但是这个数据存在于两个表内,你需要用两个update语句。如果第一个执行成功,第二个由于某种原因执行失败,将导致这个数据的不一致。数据库的数据就出错了。
如果想要避免,就用BEGIN TRAN...COMMIT TRAN ,把这两个update写在中间,如果发生如上的事情,第一个update的数据,将被退回,即没有被更新。你收到错误信息,就知道更新完全没有进行,不需要考虑部分更新的情况。
如果仅仅是查询就不需要这个。
eg:
新建两个连接
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select * from table1
where B='b2'
commit tran
若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒
--------------------------------------------------------------------------------------------------------------
问题1:当第一个连接执行完update的时候。这个时候表table1的a字段的值变成'aa'了吗?
答:此时还没有真正写入表。
问题2:第一个事务中,延迟30秒,是不是在这30秒内一直保持对table1表的更新状态?这个时候别的事务就不能进行修改了?
是这样子吗?第二个连接只有在第一个连接事务结束后才能执行select语句?
答:只是在等待。更新已经做完,但还没有提交。别的事务不能修改。
问题3:还有不知道这上面的代码跟排它锁有什么关系?默认排它锁?
答:事务中会自动加锁。update 会加上TX锁。