我目前正在做一个项目,我需要在 SQL 查询中使用 ANY 关键字,我对其原子性感到好奇。具体来说,我在使用 Go 更新 cockroachdb 中的行的上下文中使用它,类似于以下查询:
UPDATE table
SET active = NULL
WHERE id = ANY($1);
我知道 ANY 关键字用于比较,但我想知道此操作本身是否被视为原子性,或者是否需要其他措施(如事务)来确保原子性?
我暂时还没有将其包装在交易中。
ANY 关键字不会影响 UPDATE 的原子性保证。
这里有一个 CockroachDB 中的例子来重申上面的说法:
root@localhost:29000/defaultdb> CREATE TABLE atomic_test (id INT, value INT,
-> computed DECIMAL);
CREATE TABLE
Time: 12ms total (execution 12ms / network 0ms)
root@localhost:29000/defaultdb> INSERT INTO atomic_test VALUES (1, 100), (2,
-> 200), (3, 0), (4, 400);
INSERT 0 4
Time: 13ms total (execution 13ms / network 0ms)
root@localhost:29000/defaultdb> SELECT * FROM atomic_test;
id | value | computed
-----+-------+-----------
1 | 100 | NULL
2 | 200 | NULL
3 | 0 | NULL
4 | 400 | NULL
(4 rows)
Time: 2ms total (execution 2ms / network 0ms)
root@localhost:29000/defaultdb> UPDATE atomic_test SET computed = 1 / value
-> WHERE id = ANY(ARRAY[1, 2, 3, 4]);
ERROR: division by zero
SQLSTATE: 22012
root@localhost:29000/defaultdb> SELECT * FROM atomic_test;
id | value | computed
-----+-------+-----------
1 | 100 | NULL
2 | 200 | NULL
3 | 0 | NULL
4 | 400 | NULL
(4 rows)
Time: 2ms total (execution 2ms / network 0ms)
ANY 关键字的作用纯粹是为了在查询中进行比较。如上所述,UPDATE 所做的所有更改要么全部成功,要么全部失败 - 没有中间状态。