sql >> データベース >  >> RDS >> Mysql

MySQLのトリガーとテーブルロック

    これを処理する最良の方法は、ここで説明されているSELECT ...FORUPDATEパターンを使用することだと思います。 http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

    参考:

     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を使用する場合

    これがお役に立てば幸いです!




    1. Statement.setFetchSize(nSize)メソッドはSQL Server JDBCドライバーで実際に何をしますか?

    2. phpデータベースの画像は問題を示しています

    3. 依存オブジェクトがある場合にpostgresでユーザーをドロップする方法

    4. play-slick 1.0.1 / slick 3.0でmysqlデータベースに接続できません:構成エラー