gifts_count
とuser_id
フィールドを持つユーザーテーブルがあります
次のステートメントにロックを追加する必要がありますか(多くのスレッドから来る可能性があります)?
update users set gifts_count = gifts_count + 1 where users.user_id = user_id;
最善の策は、明示的なテーブルロックではなくトランザクションを使用することです。
セッションの例は次のようになります。
START TRANSACTION;
UPDATE `users` SET `gifts_count` = `gifts_count` + 1 WHERE `users`.`user_id` = user_id;
COMMIT;
必要に応じて(実行している内容に応じて)、クエリとの間で整合性チェックを行うこともできます。COMMIT
問題が発生した場合は、いつでもを使用できますROLLBACK
。
更新時に特定の行の読み取りを防止したい場合(InnoDB
行レベルのロックで使用している場合)、次のように最後にSELECT
クエリを実行できます。LOCK IN SHARE MODE
SELECT * FROM `users` `users`.`user_id` = user_id LOCK IN SHARE MODE;
COMMIT
そのクエリは、トランザクションが編集されるかROLLBACK
'dになるまでハングします。