新手sql交易问题:在read-compute -write中阻止竞争

时间:2011-09-14 14:08:30

标签: sql sql-server transactions

我想在一次交易中执行以下操作:

  • 阅读专栏
  • 如果列值与特定条件匹配,则向列
  • 写出新值

事务隔离设置为read-commited,服务器是SQL server。

如何保证另一个事务不会为列写入不同的值 看完之后?如果另一个事务改变了列,服务器是否会拒绝我的写入?

换句话说,SQL服务器可以用作给定列的分布式锁吗?

2 个答案:

答案 0 :(得分:4)

谁说你必须先读它?

UPDATE yourtable
SET    yourcolumn = CASE
                      WHEN certaincondition = 1 THEN 'newvalue'
                      ELSE yourcolumn
                    END
WHERE  id = 'yourid'  

您在UPDATE内部进行评估。它保证完全孤立。您可以从不同的实例中运行多个相同的UPDATE,这些事务将被排队并逐个处理。

答案 1 :(得分:1)

在这种情况下,您需要使用REPEATABLE READ隔离级别。使用READ COMMITTED另一笔交易可以更改您的记录 如果您可以在1个查询中重写逻辑(例如,使用updatemerge),您仍然可以使用READ COMMITTED。但有时它不是选择。例如,

SELECT ... ;
IF some_condition
BEGIN
  // execute a procedure, select from other tables, etc
END
ELSE
BEGIN
  // execute another procedure, do some other stuff
END;
// finally update the record
UPDATE ....

<强>更新

还有一个我忘记提及的选项:在REPEATABLEREAD语句中使用表提示SELECTSee了解详情)

相关问题