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

Jac*_*cko 5 sql sql-server transactions

我想在一个事务中执行以下操作:

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

事务隔离设置为read-commited,服务器是SQL Server.

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

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

a1e*_*x07 1

在这种情况下,您需要使用REPEATABLE READ隔离级别。与READ COMMITTED另一笔交易可以改变您的记录。
如果您可以在 1 个查询中重写逻辑(例如,使用updateor merge),您仍然可以使用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 ....
Run Code Online (Sandbox Code Playgroud)

更新

我忘了提到另一个选项:REPEATABLEREADSELECT语句中使用表提示(详情请参阅)