Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres:`FOR UPDATE of table`检索的顺序_Postgresql_Transactions_Locking_Database Locking - Fatal编程技术网

Postgresql Postgres:`FOR UPDATE of table`检索的顺序

Postgresql Postgres:`FOR UPDATE of table`检索的顺序,postgresql,transactions,locking,database-locking,Postgresql,Transactions,Locking,Database Locking,我想知道在连接中依赖更新时数据的一致性。我将尝试举一个简单的例子: 交易1包括: BEGIN; SELECT 1 FROM a WHERE a.id = 5 FOR UPDATE; UPDATE b SET val = 'other' WHERE b.a_id = 5; COMMIT; 交易2在以下情况下非常密切地进行: BEGIN; SELECT b.val FROM a, b WHERE a.id = 5 AND b.a_id = 5 FOR UPDATE OF a; [...] 事务2

我想知道在连接中依赖
更新
时数据的一致性。我将尝试举一个简单的例子:

交易1包括:

BEGIN;
SELECT 1 FROM a WHERE a.id = 5 FOR UPDATE;
UPDATE b SET val = 'other' WHERE b.a_id = 5;
COMMIT;
交易2在以下情况下非常密切地进行:

BEGIN;
SELECT b.val FROM a, b WHERE a.id = 5 AND b.a_id = 5 FOR UPDATE OF a;
[...]

事务2是否有可能获得锁,但仍然获得过时的
b.val
?锁位于
a
中的行上--它是否在从
b
检索行之前等待该锁?

关于该问题的评论证实了我的怀疑--锁不会延迟从其他表检索其他行。这是一个非常具体的场景,但我欢迎提供信息丰富的答案,说明实现这一点的简单方法。最后,我将第二个SELECT分为两个查询——第一个SELECT获得锁,然后第二个SELECT检索
b
行,确保它们被更新。

因为表
b
的第二个事务中没有锁,是的,可能会过时
b.val
。是的,但前提是事务1尚未提交。