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!