Django 死鎖
mysql死鎖問題參考連結: https://www.iteye.com/blog/uule-2422193
情況一
在建立完一條資料後,對此條資料的多對多鍵和外鍵進行設定時産生
如下:
tree_qs = Tree.objects.filter(id__in=list_tree_ids)
for name in list_name:
asset = Asset.objects.create(
name=name
)
asset.tree = tree_qs # Deadlock found where trying to get lock, try restarting tracsaction
asset.save()
其中,
asset
是新建立的資源,有一個多對多鍵名為
tree
,在asset建立完成的時候,進行設定。
先看下多對多鍵在資料庫中的表:
+----------------------+
| Tables_in_TestDjango |
+----------------------+
| jasset_asset |
| jasset_asset_tree |
| jtree_tree |
+----------------------+
發現,除了已知的
jasset_asset
,
jtree_tree
還有一個
jasset_asset_tree
表,這個多出來的表就是為了維護多對多鍵關系的,裡面的結構是這樣的:
+----------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| asset_id | int(11) | NO | MUL | NULL | |
| tree_id | int(11) | NO | MUL | NULL | |
+----------+---------+------+-----+---------+----------------+
隻是
asset
的
id
和
tree
的
id
對應起來的關系。
是以,回到原來的問題上,在設定多對多鍵的時候,并不是簡簡單單的指派操作,而是要在這個表中增加映射關系,這個就牽扯到了資料的修改,
django
應該是給這個表(儲存映射關系的)加了寫鎖,然後在
for
循環中,多次對操作相同的
tree
,此時就造成了死鎖。
各位大佬有沒有官方關于多對多鍵和外鍵設定時的MySQL的操作,沒找到。