1

我遇到的问题是:

我有一个包含以下字段的表(只是一个示例):

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)

现在记录的值是 10,而应该是 15。

我要强制执行以下操作:

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

现在记录的值为 15,这是我正在寻找的结果。

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

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

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

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

蜂巢的头脑在想什么?

4

1 回答 1

0

也许我想太多,但是您不只是包装整个逻辑块吗?

  • 读取值
  • 写值

适当级别的数据库事务中?

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }
[ ; ]
于 2009-04-01T08:04:24.710 回答