SQLServer中的事务与锁(三)

2014-11-24 11:09:45 · 作者: · 浏览: 1
离级别,只能看到事务处理之前的数据。
--语法
set tran isolation level <级别>

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。