Python Django select_for_update with nowait=True不为冲突的转换引发DatabaseError

Python Django select_for_update with nowait=True不为冲突的转换引发DatabaseError,python,django,database,postgresql,Python,Django,Database,Postgresql,根据Django文件: 通常,如果另一个事务已经在其中一个选定行上获取了锁,则查询将一直阻塞,直到释放锁为止。如果这不是您想要的行为,请调用select\u进行更新(nowait=True)。这将使呼叫无阻塞。如果另一个事务已经获取了冲突锁,则在计算queryset时将引发DatabaseError 我正在做这个实验,但发现了一个奇怪的行为。以下代码在同时运行时不会引发错误,但会以阻塞方式工作 def test4(): with transaction.atomic(): Workflo

根据Django文件:

通常,如果另一个事务已经在其中一个选定行上获取了锁,则查询将一直阻塞,直到释放锁为止。如果这不是您想要的行为,请调用select\u进行更新(nowait=True)。这将使呼叫无阻塞。如果另一个事务已经获取了冲突锁,则在计算queryset时将引发DatabaseError

我正在做这个实验,但发现了一个奇怪的行为。以下代码在同时运行时不会引发错误,但会以阻塞方式工作

def test4():
with transaction.atomic():
    WorkflowCallContact.objects.select_for_update(nowait=True).filter(id__in=[1,2,3,4]).update(number="22222")
    time.sleep(10)
    list(WorkflowCallContact.objects.filter(id__in=[1,2,3,4]))
为了测试,我只是打开shell并并行调用相同的函数。但是由于
nowait=True
,第二次调用没有抛出
DatabaseError
,而是被阻塞了10秒

我使用的数据库:postgres Django版本:1.9

为更新()选择更新()
更新()
不能链接。必须强制对QuerySet进行求值,例如,将其转换为列表()


我建议您通过设置
log\u statement=all
,找出哪些语句被发送到数据库。
with transaction.atomic():
list(WorkflowCallContact.objects.select_for_update(nowait=True).filter(id__in=[1,2,3,4]))
WorkflowCallContact.objects.filter(id__in=[1,2,3,4]).update(number="22222")