У меня есть следующий оператор в моей базе данных 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
и удалена?