我想在一次交易中执行以下操作:
事务隔离设置为read-commited,服务器是SQL server。
如何保证另一个事务不会为列写入不同的值 看完之后?如果另一个事务改变了列,服务器是否会拒绝我的写入?
换句话说,SQL服务器可以用作给定列的分布式锁吗?
答案 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个查询中重写逻辑(例如,使用update
或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 ....
<强>更新强>
还有一个我忘记提及的选项:在REPEATABLEREAD
语句中使用表提示SELECT
(See了解详情)