我遇到的问题是:
我有一个包含以下字段的表(只是一个示例):
ID int
Value int
我有一个名为IncreaseByFive() 的方法,它执行以下操作:
method IncreaseByFive(int ID)
{
int value = GetValueFromDB(ID);
value = value + 5;
SaveValueToDB(value, ID);
}
我要避免的是以下情况:
- 用户 A 调用方法并获取值(当前为 5)
- 用户 B 调用方法并获取值(当前为 5)
- 用户 A 将值增加 5(现在为 10)
- 用户 B 将值增加 5(现在为 10)
- 用户 A 保存价值 (10)
- 用户 B 保存价值 (10)
现在记录的值是 10,而应该是 15。
我要强制执行以下操作:
- 用户 A 调用方法并获取值(当前为 5)
- 用户 B 调用方法但必须等待,因为 A 已经调用它。(迪布斯!)
- 用户 A 增加值(现在是 10)
- 用户 B 仍在等待
- 用户 A 保存值(记录值为 10)
- 用户 B 现在可以读取值 (10)
- 用户 B 增加值 (15)
- 用户 B 保存值
现在记录的值为 15,这是我正在寻找的结果。
我过去使用静态类解决了这个问题,并在该类的构造函数中创建的静态对象上加了锁,从而通过一个静态方法集中所有工作,这迫使其他调用排队等待。然而,我担心这是不可扩展的。
我还认为事务的最高隔离级别(可序列化)也不会起作用,因为它将允许在上面不需要的示例的步骤 2 中读取。
我想另一种解决方案是创建我自己的锁表并在那里记录锁,但这似乎不是必需的。
我正在使用 C# (3.5) 和 SQL server 2008 开发这个项目。
蜂巢的头脑在想什么?