sql >> Database teknologi >  >> RDS >> Mysql

Triggere og bordlås i MySQL

Jeg tror, ​​at den bedste måde at håndtere dette på ville være at bruge SELECT ... FOR UPDATE-mønsteret beskrevet her:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

Til reference:

 SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes
 SET counter_field = counter_field + 1; 

...

Så i dit tilfælde ville du erstatte

LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
  UPDATE AlarmCount SET num = num - 1 
  WHERE RuleId = OLD.RuleId AND
      MemberId = 0 AND
      IsResolved = OLD.IsResolved;

Med noget lignende

SELECT num FROM AlarmCount WHERE RuleId = OLD.RuleId AND
          MemberId = 0 AND
          IsResolved = OLD.IsResolved FOR UPDATE;
UPDATE AlarmCount SET num = num - 1;

Jeg siger "noget lignende", fordi det ikke er helt klart for mig, hvad OLD.RuleId og OLD.IsResolved refererer til. Også værd at bemærke fra http://dev.mysql .com/doc/refman/5.0/da/innodb-locking-reads.html er:

UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field +
1); 
SELECT LAST_INSERT_ID();

Med andre ord, du kan sikkert optimere dette mønster yderligere ved kun at få adgang til tabellen én gang... men igen er der nogle detaljer om dit skema, som jeg ikke helt følger, og jeg er ikke sikker på, at jeg kunne give den faktiske erklæring, du' d har brug for. Jeg tror dog, at hvis du kigger VÆLG ... TIL OPDATERING, vil du se, hvad mønsteret bunder i, og hvad du skal gøre for at få dette til at fungere i dit miljø.

Jeg bør også nævne, at der er nogle storage-motormiljøer og transaktionsisolationsniveauer, som du bør overveje. Der er en meget, meget god diskussion om SO om dette emne her:Hvornår skal du bruge SELECT ... TIL OPDATERING?

Håber dette hjælper!




  1. Løsning i mysql for delvist indeks eller filtreret indeks?

  2. Fejl - SqlDateTime-overløb. Skal være mellem 1/1/1753 12:00:00 AM og 12/31/9999 11:59:59 PM

  3. Adgang nægtet under indstilling af DBMS_XDB.SETHTTPORT

  4. MySQL Query ORDER BY visse værdier før andre