2017-10-05 63 views
1

我在視圖中的transaction.atomic()中有一個代碼塊。我的問題是,Django是否在幕後創建了一些內置的表鎖。在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

+0

請描述您的環境並添加相關代碼。 –

+1

這是從MySQL返回的錯誤。 https://stackoverflow.com/questions/5836623/getting-lock-wait-timeout-exceeded-try-restarting-transaction-even-though-im – planet260

+0

是的,這是由mysql返回的錯誤。這讓我想知道是否有使用transaction.atomic()時由django設置的鎖。因爲我沒有在任何地方鎖定桌子。 –

回答

1

爲了修改或插入一個InnoDB表中的記錄Django的MySQL中,交易需要獲得MySQL中的exclusive lock

UPDATE ... WHERE。 ..在搜索遇到的每個記錄上設置獨有的下一個鍵鎖定。但是,對於使用唯一索引鎖定行來搜索唯一行的語句,只需要索引記錄鎖定。

...

INSERT對插入的行設置獨佔鎖。該鎖是一個索引記錄鎖,而不是下一個鍵鎖(即沒有間隙鎖),並且不會阻止其他會話插入到插入行之前的間隙中。

如果相同的記錄(或間隙)已被另一個事務鎖定,則MySQL將等待鎖釋放或上述超時發生。

基於上述代碼,我們無法判斷出了什麼問題(如果有的話)。您可以查看innodb status monitor以獲取更多信息,但沒有死鎖,其使用也會受到限制。

這種行爲是MySQL固有的,應用程序的編程語言和庫不能影響這一點。

相關問題