gpt4 book ai didi

python - postgres 中的锁定机制/postgres 中的死锁。 [我正在使用 sqlalchemy]

转载 作者:行者123 更新时间:2023-11-29 12:04:27 35 4
gpt4 key购买 nike

我对 sqlalchemy-psql 中的锁定机制是如何工作的感到非常困惑。我正在运行一个带有 sqlalchemy 和 postgres 的 python-flask 应用程序。由于我有多个线程处理一些数据并在 psql 上更新它,我遇到了以下死锁:

2015-12-31 17:[ERROR] (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely) (psycopg2.extensions.TransactionRollbackError) deadlock detected

DETAIL: Process 22833 waits for ShareLock on transaction 14114188; blocked by process 19759.

Process 19759 waits for ShareLock on transaction 14114189; blocked by process 22833.

这是否会导致死锁:

Thread 1                                       Thread 2                                   
| (start an sqlalchemy session) |
db.session() db.session()
|(Using sqlalchemy) |
Update row1 of table1 Update row2 of table 1
| |
Update row2 of table1 Update row1 of table1
| |
session.commit() session.commit()

Here是我的问题的一些答案,但我无法将它们与 sqlalchemy 联系起来。

最佳答案

在 PostgreSQL 中,行在更新时将被锁定——事实上,这实际工作的方式是每个元组(行的版本)都有一个名为 xmin 的系统字段来指示哪个事务使该元组成为当前(通过插入或更新)和一个名为 xmax 的系统字段来指示哪个事务使该元组过期(通过更新或删除)。当您访问数据时,它会检查每个元组以确定它是否对您的事务可见,方法是根据这些值检查您的事件“快照”。

如果您正在执行更新并且与您的搜索条件匹配的元组有一个 xmin 可以使它对您的快照可见,并且有一个事件事务的 xmax,它会阻塞,等待该事务完成。如果首先更新元组的事务回滚,您的事务将唤醒并处理该行;如果第一个事务提交,您的事务就会唤醒并根据当前事务隔离级别采取行动。

显然,死锁是这种情况发生在不同顺序的行的结果。 RAM中没有可以同时获得所有行的行级锁,但是如果行以相同的顺序更新,则无法获得循环锁定。不幸的是,建议的 IN(1, 2) 语法并不能保证这一点。不同的 session 可能有不同的成本因素处于事件状态,后台“分析”任务可能会在一个计划和另一个计划的生成之间更改表的统计信息,或者它可能正在使用 seqscan 并受到 PostgreSQL 优化的影响,这会导致新的 seqscan加入一个已经在进行中的并“循环”以减少磁盘 I/O。

读这个 http://elioxman.blogspot.in/2013/02/postgres-deadlock.html

关于python - postgres 中的锁定机制/postgres 中的死锁。 [我正在使用 sqlalchemy],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34603983/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com