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

9 浏览
0 Comments

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

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

with transaction.atomic():
    #执行数据库操作的代码块
    update_user() #更新用户表
    create_customer_products() #将用户ID更新到客户产品表中

原因是当我运行这个代码块时,我会得到一个"Lock wait timeout exceeded; try restarting transaction"的错误。环境是在CentOS上运行的Django和MySQL。

0
0 Comments

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

在MySQL中,为了修改或插入InnoDB表中的记录,事务需要获取独占锁:

UPDATE ... WHERE ... 对搜索遇到的每条记录设置一个独占的next-key锁。然而,只有使用唯一索引锁定行来搜索唯一行的语句需要索引记录锁。

...

INSERT对插入的行设置独占锁。此锁是索引记录锁,而不是next-key锁(也就是说,没有间隙锁),不会阻止其他会话在插入行之前插入间隙。

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

根据上述代码,我们无法确定发生了什么错误(如果有的话)。您可以查看innodb状态监视器以获取更多信息,但如果没有死锁,它的使用也会受到限制。

这种行为是MySQL固有的,应用程序的编程语言和库无法影响此行为。

0