【发布时间】:2017-06-23 23:02:45
【问题描述】:
我正在使用我更新的中间表,以确保不能在不能同时访问的关键表上处理其他并发操作。
事务 1
BEGIN
UPDATE locktable
/* Do some stuff */
...
COMMIT
并发事务2
BEGIN
Update locktable
/* Do some other stuff */
...
COMMIT
这样我可以确定事务 1 和事务 2 是原子的。
出于简化和性能原因,我将代码更改为 WITH 子句语句。 我想知道我是否可以以与 CTE 相同的方式保证操作原子性。
CTE 简化示例:
事务 1
WITH
lock_op AS (
UPDATE locktable
...
RETURNING id),
some_stuff AS
(
/* Do insert and update operations with RETURNING clause*/
...
)
SELECT *
FROM some_stuff
WHERE EXISTS (SELECT 1 FROM lock_op)
并发事务2
WITH
lock_op AS (
UPDATE locktable
...
RETURNING id),
other_stuff AS
(
/* Do insert and update operations with RETURNING clause*/
...
)
SELECT *
FROM other_stuff
WHERE EXISTS (SELECT 1 FROM lock_op)
基本上,我想知道“SELECT 1 FROM lock_op”是否在来自 some_stuff 和 other_stuff 的任何 INSERT 和 UPDATE 之前启动,因此,是否暂时保护了由 WITH 范围分隔的事务的关键数据?
【问题讨论】:
标签: postgresql concurrency transactions common-table-expression