【问题标题】:Can this result in a deadlock in django + postgres?这会导致 django + postgres 陷入僵局吗?
【发布时间】:2017-08-12 14:08:27
【问题描述】:

我有两个同时运行的进程,它们运行不同的事务,最终到达相同的代码路径:

@transaction.atomic 
def myFunc():
    object = x.objects.get(filter=sample_filter) // Assume this gets a single row back
    object.sample_property = "Hello World"
    object.save()

其中一个进程不断报告在 object.save() 处等待 ShareLock 的死锁。我假设另一个没有报告,因为它是没有被杀死的那个。如果这些进程最终从 X 中选择同一行,会导致死锁吗?我看不出是怎么回事,因为 .get() 没有在“对象”上加锁,是吗?

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    我假设您使用的是 PostgreSQL,那么它默认处于 READ-COMITTED 隔离级别。所以是的,在您的原子事务中,例如如果您在get() 之后调用pdb,那么没有pdb 的其他代码应该在到达save() 时等待其他人的事务完成。对于您的情况,应该不会发生死锁。

    【讨论】:

    • 谢谢,我确实有我忘记包含的 transaction.atomic
    • 没问题,更新了我的答案以包括隔离级别。
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多