我在我的PostgreSQL 10.5数据库中有以下语句,我在一个repeatable read
事务中执行:
delete from task
where task.task_id = (
select task.task_id
from task
order by task.created_at asc
limit 1
for update skip locked
)
returning
task.task_id,
task.created_at
不幸的是,当我运行它时,有时会出现:
[67] ERROR: could not serialize access due to concurrent update
[67] STATEMENT: delete from task
where task.task_id = (
select task.task_id
from task
order by task.created_at asc
limit $1
for update skip locked
)
returning
task.task_id,
task.created_at
这意味着交易回滚是因为其他交易在此期间修改了该记录。 (我想是这样吧?)
我不太理解这个。不同的交易如何能够修改一个使用“for update skip locked”选择并删除的记录?
READ COMMITTED
依然是安全的。但这取决于具体的需求。安全性针对什么?我建议您开一个新的问题并定义相关细节。(如果这个问题得到了恰当的回答,请考虑接受它。) - Erwin Brandstetter