天天看點

Django 死鎖 Deadlock found where trying to get lock, try restarting tracsactionDjango 死鎖

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的操作,沒找到。