在表格行上调用Dibs

时间:2009-04-01 07:47:49

标签: locking row serializable

我遇到的问题是:

我有一个表(只是一个例子),其中包含以下字段:

ID int
Value int

我有一个名为IncreaseByFive()的方法,它执行以下操作:

method IncreaseByFive(int ID)
{    
    int value = GetValueFromDB(ID);
    value = value + 5;
    SaveValueToDB(value, ID);    
}

我想避免的是以下情况:

  1. 用户A调用方法并获取值(当前为5)
  2. 用户B调用方法并获取值(当前为5)
  3. 用户A将值增加5(现在为10)
  4. 用户B将值增加5(现在为10)
  5. 用户A保存值(10)
  6. 用户B保存值(10)
  7. 现在记录的值为10,应为15。

    我想强制的是以下内容:

    1. 用户A调用方法并获取值(当前为5)
    2. 用户B调用方法但必须等待,因为A已经调用它。 (DIBS!)
    3. 用户A增加值(现在为10)
    4. 用户B仍在等待
    5. 用户A保存值(记录值为10)
    6. 用户B现在可以读取值(10)
    7. 用户B增加值(15)
    8. 用户B保存值
    9. 现在记录的值为15,这是我正在寻找的结果。

      我过去使用静态类解决了这个问题并对该类的构造函数中创建的静态对象进行了锁定,从而通过一个静态方法汇集了所有工作,这迫使其他调用在线等待。但我担心这不可扩展。

      我还认为事务的最高隔离级别(可序列化)不会起作用,因为它将允许在上面不需要的示例的步骤2中读取。

      我想另一个解决方案是创建我自己的锁表并在那里记录锁,但这似乎不应该是必要的。

      我正在使用C#(3.5)和SQL server 2008开发此项目。

      蜂巢思维的想法是什么?

1 个答案:

答案 0 :(得分:0)

也许我 over 未解决这个问题,但是你不能只包装整个逻辑块。

  • 读取值
  • 写入值

appropriate level?

的数据库事务中
SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }
[ ; ]