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

Trigger e blocco della tabella in MySQL

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!