【问题标题】:SQL Server: atomic update in read committed, can detect concurrent write?SQL Server:读取提交中的原子更新,可以检测并发写入吗?
【发布时间】:2019-07-26 11:57:39
【问题描述】:

如果我有并发事务同时使用已提交的读隔离级别和事务主体如下所示:

DECLARE @value..

SELECT @value = balance
FROM MyTable
WHERE Account = 1

UPDATE MyTable
SET balance = @value+@pAmount
WHERE Account = 1 AND Balance = @value

IF @@COUNT == 0 
    THROW 'another transaction changed'

UPDATE 的 WHERE 读取 Balance 列时,是保证读取已提交还是读取另一个打开事务的脏写?换句话说,我可以使用 READ COMMITTED 检测丢失的更新并检查我的更新是否有任何影响。

【问题讨论】:

    标签: sql-server transaction-isolation


    【解决方案1】:

    由于@value 似乎是一个标量变量,我认为您只需一次更新即可完成整个逻辑:

    UPDATE MyTable
    SET balance = balance + 1
    WHERE Account = 1;
    

    原因是@value 应该始终只是第一个帐户的当前余额。

    【讨论】:

    • 谢谢,我更新了示例。而不是总是加1,不同的交易可以增加不同的金额。但即使在这种情况下,我认为答案是一样的,我可以使用单一更新。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2013-03-03
    • 1970-01-01
    相关资源
    最近更新 更多