Penso che il modo migliore per gestirlo sarebbe usare il modello SELECT ... FOR UPDATE descritto qui:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
Per riferimento:
SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes
SET counter_field = counter_field + 1;
...
Quindi nel tuo caso sostituiresti
LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved;
Con qualcosa come
SELECT num FROM AlarmCount WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved FOR UPDATE;
UPDATE AlarmCount SET num = num - 1;
Dico "qualcosa di simile" perché non mi è del tutto chiaro a cosa facciano riferimento OLD.RuleId e OLD.IsResolved. Vale anche la pena notare da 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();
In altre parole, probabilmente puoi ottimizzare ulteriormente questo modello accedendo alla tabella solo una volta ... ma ancora una volta ci sono alcuni dettagli sul tuo schema che non seguo del tutto e non sono sicuro di poter fornire l'effettiva affermazione che ' d bisogno. Penso che se dai un'occhiata SELEZIONA ... PER AGGIORNAMENTO, tuttavia, vedrai a cosa si riduce lo schema e cosa devi fare per farlo funzionare nel tuo ambiente.
Dovrei anche menzionare che ci sono alcuni livelli di isolamento delle transazioni e dell'ambiente del motore di archiviazione che vorrai considerare. C'è un'ottima discussione su SO su questo argomento qui:Quando usare SELEZIONA... PER AGGIORNARE?
Spero che questo aiuti!