我有两个同时运行不同事务的进程,这些事务最终到达相同的代码路径:
@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(( 没有在"对象"上放置锁定,是吗?
我假设你使用的是PostgreSQL,那么默认情况下它处于READ-COMITTED隔离级别。所以是的,在您的原子事务中,例如,如果您在get()
之后调用pdb
,那么没有pdb
的其他代码应该等待其他人的事务在到达save()
时完成。对于您的情况,不应发生死锁。