23

私たちが使用している目的について質問がありSELECT FOR UDPATEますか? それは正確に何をしますか?

テーブルから行を選択し、同じ行を更新する必要がある 2 つのテーブルがあります。

例えば:

クエリを選択

SELECT * from  t1 WHERE city_id=2 for update

クエリを更新

UPDATE t1 SET final_balance = final_balance - 100 WHERE city_id ='2'

私の質問- これは更新が完了するまで読み取り操作を本当にロックしますか、それとも正確には何を処理しますか?

私の考えは、私の更新が完了するまで、誰もこの行から/への読み取り/更新ができないということです..

ありがとう!

4

1 に答える 1

43

SELECT ... FOR UPDATEトランザクションが完了する (コミットまたはロールバックされる) まで、書き込み (排他的) ロックでレコードをロックします。

レコードを選択し、更新するまで変更されないようにするには、トランザクションを開始し、 を使用してレコードを選択し、SELECT ... FOR UPDATE簡単な処理を行い、レコードを更新してから、トランザクションをコミット (またはロールバック) します。

トランザクション外で使用した場合SELECT ... FOR UPDATE(autocommit ON)、ロックはすぐに解放されます。そのため、必ずトランザクションを使用してロックを保持してください。

パフォーマンスのために、トランザクションを長時間開いたままにしないでください。そのため、更新はすぐに実行する必要があります。

于 2015-01-09T20:27:14.900 に答える