sql >> Base de Datos >  >> RDS >> Mysql

Disparadores y bloqueo de tablas en MySQL

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!