これを処理する最良の方法は、ここで説明されているSELECT ...FORUPDATEパターンを使用することだと思います。
参考:
SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes
SET counter_field = counter_field + 1;
...
したがって、あなたの場合は、交換します
LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved;
のようなもので
SELECT num FROM AlarmCount WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved FOR UPDATE;
UPDATE AlarmCount SET num = num - 1;
OLD.RuleIdとOLD.IsResolvedが何を参照しているのかが完全にはわからないため、「何かのようなもの」と言います。 http://dev.mysqlからも注目に値します.com / doc / refman / 5.0 / en / innodb-locking-reads.html は:
UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field +
1);
SELECT LAST_INSERT_ID();
言い換えれば、テーブルに1回アクセスするだけで、このパターンをさらに最適化できる可能性があります...しかし、スキーマに関する詳細がいくつかありますが、私は完全には従いません。実際のステートメントを提供できるかどうかはわかりません。 d必要。 SELECT ... FOR UPDATEを見てみると、パターンが何に要約されるのか、そしてこれを環境で機能させるために何をする必要があるのかがわかると思います。
また、考慮したいストレージエンジン環境とトランザクション分離レベルがいくつかあることにも言及する必要があります。このトピックに関するSOについては、非常に優れた議論があります: SELECT ... FORUPDATEを使用する場合
これがお役に立てば幸いです!