我在视图中的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
答案 0 :(得分:1)
为了在innodb表中修改或插入记录,事务需要在MySQL中获取exclusive lock:
UPDATE ... WHERE ...在搜索遇到的每条记录上设置一个独占的下一键锁定。但是,对于使用唯一索引锁定行以搜索唯一行的语句,只需要索引记录锁定。
...
INSERT在插入的行上设置独占锁。此锁是索引记录锁,而不是下一键锁(即没有间隙锁),并且不会阻止其他会话在插入行之前插入间隙。
如果同一记录(或间隙)已被另一个事务锁定,则MySQL等待释放锁定或发生上述超时。
基于上面的代码,我们无法分辨出错的原因(如果有的话)。您可以查看innodb status monitor以获取更多信息,但如果没有死锁,其使用也将受到限制。
这种行为是MySQL固有的,应用程序的编程语言和库不能影响这一点。