SQL Server中的事务与锁
作者:网络转载 发布时间:[ 2014/6/10 13:15:00 ] 推荐标签:SQL 数据库
read uncommitted隔离级别的例子:
|
begin tran
set deadlock_priority low
update Earth set Animal='老虎'
waitfor delay '0:0:5' --等待5秒执行下面的语句
rollback tran
|
|
set tran isolation level read uncommitted
select * from Earth --读取的数据为正在修改的数据 ,脏读
waitfor delay '0:0:5' --5秒之后数据已经回滚
select * from Earth --回滚之后的数据
|

read committed隔离级别的例子:
begin tran
update Earth set Animal='老虎'
waitfor delay '0:0:10' --等待5秒执行下面的语句
rollback tran
set tran isolation level read committed
select * from Earth ---获取不到老虎,不能脏读
update Earth set Animal='猴子1' --可以修改
waitfor delay '0:0:10' --10秒之后上一个事务已经回滚
select * from Earth --修改之后的数据,而不是猴子
剩下的几个级别,不一一列举啦,自己理解吧。
设置锁超时时间
发生死锁的时候,数据库引擎会自动检测死锁,解决问题,然而这样子是很被动,只能在发生死锁后,等待处理。
然而我们也可以主动出击,设置锁超时时间,一旦资源被锁定阻塞,超过设置的锁定时间,阻塞语句自动取消,释放资源,报1222错误。
好东西一般都具有两面性,调优的同时,也有他的不足之处,那是一旦超过时间,语句取消,释放资源,但是当前报错事务,不会回滚,会造成数据错误,你需要在程序中捕获1222错误,用程序处理当前事务的逻辑,使数据正确。
--查看超时时间,默认为-1
select @@lock_timeout
--设置超时时间
set lock_timeout 0 --为0时,即为一旦发现资源锁定,立即报错,不在等待,当前事务不回滚,设置时间需谨慎处理后事啊,你hold不住的。
仔细阅读,希望能分享给你一点点东西,谢谢,over。

sales@spasvo.com