我在DB表中有一个列,当我们说某个项被选中时,该列必须递增。但它可以并行选择,对于任何记录,它必须从0开始。我的解决方案是从DB过程增加值,但是我可以确定第一个过程设法在另一个过程想要加载值之前增加该值递增?我的意思是:
t0 Value is 10
t1 Procedure1 valueToInc = Value
t2 Procedure2 valueToInc = Value
t3 Procedure1 valueToInc ++
t4 Procedure2 valueToInc ++
t5 Value = 11
t6 Value = 11
从Procedure1回写的值是11,但是从Procedure2显然也是11(需要在那里保证12)。
我还检查了身份(属性)和序列(Transact-SQL),但似乎没有什么适合我。
修改
我想解决的是我有一个控制台应用程序 - TCP服务器和MSSQL数据库,我有一个User表。每次单个用户想要登录时,我都必须增加用户loginCount字段。我知道,这里的任何并行化都不可能或者可以从代码中管理,但有人告诉我,我必须通过数据库进行并行访问,因此不仅仅是使用更新查询。我有它作为面试项目......
我希望通过我的第一个解释更容易理解,但它不会起作用。
答案 0 :(得分:1)
你可以使用
UPDATE Users
SET LoginCount = ISNULL(LoginCount,0) + 1
WHERE UserId = @UserId
在并发条件下这是完全安全的。
答案 1 :(得分:0)
使用事务隔离级别等于SERIALIZABLE
的事务。
SERIALIZABLE
- 语句无法读取已修改但尚未由其他事务提交的数据。
- 在当前事务完成之前,没有其他事务可以修改当前事务已读取的数据。
- 在当前事务完成之前,其他事务无法插入具有键值的新行,这些键值将落在当前事务中任何语句读取的键范围内。
不要加载Value
来增加它:增加它,然后选择它(在事务中)。这将锁定表/行(取决于)更新/选择其他事务。