私は今これを試していますが、インターネット上での検索では解決策が出ていません。PythonがMySQLアップデートでハングアップする
アクセスする前に別のプロセスが自分のDBにアクセスしているかどうか確認したいと思います。私はカラムidとstateを持つテーブルを持っています。状態が1の場合は0に変更してアクセスし続けます。それ以外の場合はそのままにします。以下は、それが動作しませんなぜ私が見ることができない、私のコードですが、それはcursor.execute(set_lock)
get_lock = "SELECT state FROM running WHERE id=1"
cursor.execute(get_lock)
result = cursor.fetchall()
if(result[0][0]):
set_lock = "UPDATE running SET state=0 WHERE id=1"
cursor.execute(set_lock)
は、私はそれがカーソルの再利用とは何かを持っているかなり確信している、ここで最後の行にするたびにハングアップしますしかし、なぜそれが問題になるべきかわからない、私はそれを成功させる前にやった。あなたが偉大な助けをするなら、私は、問題解決があったが、修正がフレーク状だと思った
乾杯
、で開始する動作するように見えたが、その後、間違った状態を返す始めました。 PHPMyAdminでMySQLステートメントを実行すると、必要に応じて1が返されますが、結果を出力するときには0が返され、ifステートメントの内容はスキップされます。
cursor.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;")
get_lock = "SELECT state FROM running WHERE id=1;"
cursor.execute(get_lock)
result = cursor.fetchall()
if(result[0][0]):
set_lock = "UPDATE running SET state=0 WHERE id=1;" //Lock
cursor.execute(set_lock)
cursor.execute("COMMIT;")
---- DO WHAT I NEED TO DO ----
set_lock = "UPDATE running SET state=1 WHERE id=1;" //Unlock
cursor.execute(set_lock)
cursor.execute("COMMIT;")
cursor.execute("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;")
cursor.close()
その間はhttp://stackoverflow.com/questions/10935850/when-to-use-select-for-updateを読んでください。現在の実装は、トランザクションの分離に応じて競合状態でオープンされている可能性があります。 –
ありがとう、私のためのソリューションにつながる。 –
更新と更新を選択した後、コミットすることで行ロックを解放する必要があります。さもなければ、更新のためのもう1つの選択は行ロックを待つのをブロックするでしょう。 –