表级锁的使用

13.4.3  表级锁的使用

在SQL Server 2008中,用户对数据库中的数据表加锁后,其他用户不可以对数据表进行操作,直到该用户对数据表进行解锁操作后,其他用户才可以进行操作。

通过使用表级锁可以实现对数据表的锁定操作。常见的表级锁提示如下所示。

HOLDLOCK:该语句表示持有共享锁,直到整个事务完成。

ROWLOCK:该语句表示强制使用表锁、盘区锁和行锁代替页锁等。

NOLOCK:该语句执行时允许读"脏数据",但不发出共享锁。

PAGLOCK:该语句表示在使用一个表锁的地方使用多个页锁。

READPAST:使用该语句可以跳过任何锁定执行事务。

TABLOAKX:使用该语句可以强制使用独占表级锁。

UPDLOCK:该语句表示在事务结束之前,强制在读表时使用更新锁而不用共享锁。

下面通过实例讲解表级锁的使用方法。

【实例13-7】在"商品库存"数据表中使用HOLDLOCK表级锁。在SQL Server Management Studio中新建一个查询窗口,在该查询窗口中输入如代码13.7所示的代码;再次新建一个查询窗口,在窗口中输入如代码13.8所示的代码。

代码13.7

 
 
  1. 01  BEGIN TRANSACTION  
  2. 02    DECLARE @dt_time varchar(8)    
  3. 03    /* 对表实行HOLDLOCK表级锁,即共享锁*/  
  4. 04    SELECT * FROM 商品库存 WITH (HOLDLOCK)   
  5. 05    /* 显示加锁时间*/  
  6. 06    SELECT @dt_time=CONVERT(VARCHAR,GETDATE(),8)  
  7. 07    PRINT '用户U1锁定时间为:' + @dt_time  
  8. 08    /* 等待秒*/  
  9. 09    WAITFOR DELAY '00:00:15'  
  10. 10    /* 显示解锁时间*/  
  11. 11    SELECT @dt_time=CONVERT(VARCHAR,GETDATE(),8)  
  12. 12    PRINT '用户U1解锁时间为:' + @dt_time  
  13. 13    COMMIT TRANSACTION /* 提交事务,解除锁定*/  
  14. 代码13.8  
  15. 14  BEGIN TRANSACTION  
  16. 15    DECLARE @dt_time varchar(8)    
  17. 16    SELECT @dt_time=CONVERT(VARCHAR,GETDATE(),8)  
  18. 17    PRINT '用户U2开始事务的时间为:' + @dt_time  
  19. 18    SELECT * FROM 商品库存   
  20. 19    SELECT @dt_time=CONVERT(VARCHAR,GETDATE(),8)  
  21. 20    PRINT '用户U2执行查询的时间为:' + @dt_time  
  22. 21    DELETE 商品库存 FROM 商品库存   
  23. 22    WHERE 名称='大米'  
  24. 23    SELECT @dt_time=CONVERT(VARCHAR,GETDATE(),8)  
  25. 24    PRINT '用户U2删除数据的时间为:' + @dt_time  
  26. 25    ROLLBACK /* 回滚事务*/ 

【执行代码】首先执行代码13.7,接着执行代码13.8。当执行代码13.7时,"商品信息"数据表在被锁定15秒之后解锁。在15秒之内,如果执行代码13.8,则可以用SELECT语句执行查询操作,但不可以执行DELETE语句删除数据,必须等待解锁后才能执行DELETE语句。代码13.7的执行结果如图13.4所示,代码13.8的执行结果如图13.5所示。

 
图13.4  代码13.7的执行结果
 
图13.5  代码13.8的执行结果

【深入学习】关于上述代码的分析如下所示:

第1~4行启动一个事务,实现在"商品库存"数据表中使用HOLDLOCK表级锁的操作。

第6~7行显示数据表被锁定的时间。

第9~13行在等待15秒之后解除对数据表的锁定,然后提交事务。

第14~18行启动一个事务,查询数据表中的数据信息,并记录查询数据的时间。

第19~24行执行删除数据表中数据信息的操作,并记录删除数据的时间。

第25行执行回滚事务的操作。

说明:若想实现本实例,应首先创建两个不同的查询窗口,然后将代码13.7和代码13.8输入到不同的查询窗口中分别执行,并且两个查询窗口中程序代码的执行间隔不能超过15秒。

转载于:https://www.cnblogs.com/binfire/archive/2010/03/19/1689637.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值