在django中创建原子事务是否会自动创建锁

时间:2017-10-05 09:45:23

标签: python mysql django transactions

我在视图中的transaction.atomic()中有一个代码块。我的问题是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上的django mysql

1 个答案:

答案 0 :(得分:1)

为了在innodb表中修改或插入记录,事务需要在MySQL中获取exclusive lock

  

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

     

...

     

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

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

基于上面的代码,我们无法分辨出错的原因(如果有的话)。您可以查看innodb status monitor以获取更多信息,但如果没有死锁,其使用也将受到限制。

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