2017-10-05 9 views
1

ビュー内のtransaction.atomic()内にコードブロックがあります。私の質問は、djangoはいくつかのinbuiltテーブルをバックグラウンドでロックを作成しますか?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 

なぜなら、コードブロックを実行すると、「ロック待機タイムアウトを超えました;トランザクションを再起動してください」エラーが発生するからです。セットアップは、InnoDBのテーブル内のレコードを変更または挿入するために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

上のDjangoのMySQLで、トランザクションは、MySQLでexclusive lockを取得する必要がある

UPDATE ...。 ..は、検索が遭遇するすべてのレコードに排他的な次のキーロックを設定します。ただし、ユニーク索引を使用して行をロックして一意の行を検索する文では、索引レコードのロックのみが必要です。

...

INSERTは、挿入された行に排他ロックを設定します。このロックは、次のキーロックではなくインデックスレコードロックです(つまり、ギャップロックはありません)。挿入された行の前に他のセッションがギャップに挿入されることを防ぎません。

すでに別のトランザクションによって同じレコード(またはギャップ)がロックされている場合、MySQLはロックが解除されるのを待つか、上記のタイムアウトが発生します。

上記のコードに基づいて、何が間違っているのかを知る方法はありません。 innodb status monitorを調べると詳しい情報が得られますが、デッドロックがなければその使用は制限されます。

この動作はMySQLに固有のもので、アプリケーションのプログラミング言語とライブラリはこれに影響を与えることはできません。

関連する問題