mat*_*jes 2 postgresql concurrency transactions select-for-update
SELECT ... FOR UPDATE我想知道当两个事务并行执行查询时会发生什么。背景是我想使用SELECT ... FOR UPDATEwith实现一个作业队列SKIP LOCKED,如下所示: https: //vladmihalcea.com/database-job-queue-skip-locked/。但在本文中,查询非常简单。
具有两个事务 T1 和 T2 的示例(事务隔离级别设置为READ_COMMITTED):
SELECT ... FOR UPDATE,搜索新行,这需要一些时间。SELECT ... FOR UPDATE与 T1 相同的 WHERE 子句和参数执行,这也需要一些时间。一些问题:
SKIP LOCKED跳过标记的行吗?T1 进行更改后,T2 会重新评估其结果集吗?每个事务在找到行时都会锁定这些行,因此锁定不是原子的。可能会出现 T1 锁定几行而 T2 锁定其他一些行的情况。
由于每个事务在找到行时立即锁定行,因此这种情况不会发生。一行要么被锁定,在这种情况下它被跳过,要么它未被锁定,在这种情况下它被锁定。
如果 T1 在 T2 扫描完表之前提交,T2 会很乐意锁定 T1 已经处理过的所有行。
是的,那会起作用的。T2 将在检查条件并锁定该行之前获取每行的最新版本。
| 归档时间: |
|
| 查看次数: |
1666 次 |
| 最近记录: |