PythonでMySQLdbを使用しています。
成功または失敗する可能性のある更新があります。
UPDATE table
SET reserved_by = PID
state = "unavailable"
WHERE state = "available"
AND id = REQUESTED_ROW_ID
LIMIT 1;
推測できるかもしれませんが、複数のプロセスがデータベースを使用しています。競合状態が問題を引き起こすことなく、プロセスが自分で行を安全に取得できるようにする必要があります。
私の理論(おそらく正しくない)は、このクエリで成功できるのは1つのプロセス(.rowcount = 1)のみであり、他のプロセスは失敗する(.rowcount = 0)か、別の行を取得する(.rowcount = 1)というものです。
問題は、MySQLdbを介して発生するすべてが仮想世界で発生しているように見えることです。.rowcountは= 1を読み取りますが、.commit()を実行するまで、実際に何かが発生したかどうかを実際に知ることはできません。
私の質問:
- MySQLでは、単一のUPDATEはそれ自体の中にアトミックですか?つまり、上記の同じUPDATE(PID値は異なるが、REQUESTED_ROW_IDは同じ)が「1回」で同じMySQLサーバーに送信された場合、一方が成功し、もう一方が失敗することが保証されますか?
- 「conn.commit()」を呼び出した後、意味のある変更があったかどうかを知る方法はありますか?**実際のコミット操作で信頼できる.rowcountを取得できますか?
- .commit操作は実際のクエリ(SETとWHEREの条件はそのまま)を送信しますか、それとも影響を受けた行に対して、それらに影響を与えたWHERE句とは無関係にSETを実行するだけですか?
- 私の問題は.autocommitによってきちんと解決されていますか?