§ ITPOW >> 文档 >> C#

事务与锁的探讨-人工锁

作者:vkvi 来源:ITPOW(原创) 日期:2016-10-20

前一篇我们探讨了自动锁,但有时我们觉得自动锁不符合我们的要求,比如:

代码执行顺序为:

  1. 事务 A 读取记录
  2. 事务 B 更新同一记录
  3. 事务 A 更新同一记录

如果不加干扰,执行顺序也是和代码顺序一样的。但是由于有特别需求,我们期望在数据库管理系统中执行顺序为:

  1. 事务 A 读取记录
  2. 事务 A 更新同一记录
  3. 事务 B 更新同一记录

也就是说事务 B 更新绝对不能位于事务 A 读取事务 A 更新之间。

那就在第 1 步的读取记录 SQL 语句加上锁标志,用 WITH,示例如下:

选择不同的锁,会达到不同的效果,比如如果我们使用 WITH(TABLOCKX),则事务 B 不光是 update,就连 select 都会等待。

请参阅:行级锁为什么锁住了整个表?

另:WITH 要放在 WHERE 之前。

关于锁更多信息请参见:https://msdn.microsoft.com/zh-cn/library/ms187373.aspx

这篇写得也不错:http://m.blog.csdn.net/article/details?id=4047191

相关文章