我正在运行一个Django应用程序,它计算并存储一组关于另一个表中的一个表的统计信息,同时保持两者之间的M2M链接。为了生成stats表,我已经设置了一个多处理系统,它可以查询表1中的所有内容并将其加载到表2中。但是,当我同时在许多处理器上运行查询时,我会遇到死锁错误(即使我打开自动提交)。
我的统计数据表如下所示:
class Stats(models.Model):
score = models.IntegerField(...)
objects_from_table_1 = models.ManyToManyField('table_1', related_name='stats', ...)
我的解析代码如下所示(在许多与数据库有自己连接的独立进程中同时发生)
for table1_object in table1_objects:
for stat_obj in stat_objs:
stat_obj.objects_from_table_1.add(table1_object)
stat_obj.save()
我尝试保存对象时遇到死锁错误。我相信正在发生的事情是存在锁定,因为多个进程正在尝试同时将table1_object添加到同一个stat_obj,这会造成死锁。
是否有某种方法可以让系统等待锁解析自身或重构我的解析代码以便不会发生此死锁?
提前致谢。
答案 0 :(得分:0)
在玩了一段时间之后,我们决定简单地保存stat_obj的输入应该是什么,然后再运行一个stat_objs列表 - 这样,每个stat_obj只会被一个线程修改在任何给定的时间。