Creo que la mejor manera de manejar esto sería usar el patrón SELECCIONAR ... PARA ACTUALIZAR descrito aquí:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
Para referencia:
SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes
SET counter_field = counter_field + 1;
...
Entonces, en su caso, reemplazaría
LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved;
Con algo como
SELECT num FROM AlarmCount WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved FOR UPDATE;
UPDATE AlarmCount SET num = num - 1;
Digo "algo así como" porque no me queda del todo claro a qué se refieren OLD.RuleId y OLD.IsResolved. También vale la pena señalar de http://dev.mysql .com/doc/refman/5.0/en/innodb-locking-reads.html es:
UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field +
1);
SELECT LAST_INSERT_ID();
En otras palabras, probablemente pueda optimizar aún más este patrón accediendo a la tabla solo una vez... pero, de nuevo, hay algunos detalles sobre su esquema que no sigo del todo, y no estoy seguro de poder proporcionar la declaración real que usted' necesito Sin embargo, creo que si echa un vistazo a SELECCIONAR ... PARA ACTUALIZAR, verá a qué se reduce el patrón y qué debe hacer para que esto funcione en su entorno.
Debo mencionar también que hay algunos entornos de motor de almacenamiento y niveles de aislamiento de transacciones que querrá considerar. Hay una muy, muy buena discusión sobre SO sobre este tema aquí:¿Cuándo usar SELECCIONAR... PARA ACTUALIZAR?
¡Espero que esto ayude!