1

gifts_countuser_idフィールドを持つユーザーテーブルがあります

次のステートメントにロックを追加する必要がありますか(多くのスレッドから来る可能性があります)?

update users set gifts_count = gifts_count + 1 where users.user_id = user_id;
4

1 に答える 1

2

最善の策は、明示的なテーブルロックではなくトランザクションを使用することです。

セッションの例は次のようになります。

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になるまでハングします。

于 2013-01-09T14:36:46.777 に答える