2017-10-05 64 views
1

我在视图中的transaction.atomic()中有一个代码块。我的问题是,Django是否在幕后创建了一些内置的表锁。在django中创建原子事务是否自动创建一个锁

with transaction.atomic(): 
    #code block that does database operations 
    update_user() #this updates user table 
    create_customer_products() #this updates user id to customer products table 

原因是我运行代码块时出现“超出锁定等待超时;尝试重新启动事务”错误。

的设置是在CentOS

+0

请描述您的环境并添加相关代码。 –

+1

这是从MySQL返回的错误。 https://stackoverflow.com/questions/5836623/getting-lock-wait-timeout-exceeded-try-restarting-transaction-even-though-im – planet260

+0

是的,这是由mysql返回的错误。这让我想知道是否有使用transaction.atomic()时由django设置的锁。因为我没有在任何地方锁定桌子。 –

回答

1

为了修改或插入一个InnoDB表中的记录Django的MySQL中,交易需要获得MySQL中的exclusive lock

UPDATE ... WHERE。 ..在搜索遇到的每个记录上设置独有的下一个键锁定。但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁定。

...

INSERT对插入的行设置独占锁。该锁是一个索引记录锁,而不是下一个键锁(即没有间隙锁),并且不会阻止其他会话插入到插入行之前的间隙中。

如果相同的记录(或间隙)已被另一个事务锁定,则MySQL将等待锁释放或上述超时发生。

基于上述代码,我们无法判断出了什么问题(如果有的话)。您可以查看innodb status monitor以获取更多信息,但没有死锁,其使用也会受到限制。

这种行为是MySQL固有的,应用程序的编程语言和库不能影响这一点。

相关问题