【问题标题】:Locking mechanism in postgres/ Deadlocks in postgres. [I am using sqlalchemy]postgres 中的锁定机制/postgres 中的死锁。 [我正在使用 sqlalchemy]
【发布时间】:2016-01-09 19:19:20
【问题描述】:

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

2015-12-31 17:[错误](由于查询调用自动刷新而引发;如果此刷新过早发生,请考虑使用 session.no_autoflush 块)(psycopg2.extensions.TransactionRollbackError)检测到死锁

详细信息:进程 22833 等待事务 14114188 上的 ShareLock;被进程 19759 阻止。

进程 19759 等待事务 14114189 上的 ShareLock;被进程 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 联系起来。

【问题讨论】:

    标签: python postgresql sqlalchemy flask-sqlalchemy database-deadlocks


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-18
      • 2018-03-04
      • 2020-03-19
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多