SQL中的ANY关键字算原子操作吗?

问题描述 投票:0回答:1

我目前正在做一个项目,我需要在 SQL 查询中使用 ANY 关键字,我对其原子性感到好奇。具体来说,我在使用 Go 更新 cockroachdb 中的行的上下文中使用它,类似于以下查询:

UPDATE table
SET active = NULL
WHERE id = ANY($1);

我知道 ANY 关键字用于比较,但我想知道此操作本身是否被视为原子性,或者是否需要其他措施(如事务)来确保原子性?

我暂时还没有将其包装在交易中。

sql transactions cockroachdb
1个回答
0
投票

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 所做的所有更改要么全部成功,要么全部失败 - 没有中间状态。

© www.soinside.com 2019 - 2024. All rights reserved.