sql >> Databasteknik >  >> RDS >> Mysql

Triggers och tabelllås i MySQL

Jag tror att det bästa sättet att hantera detta är att använda SELECT ... FÖR UPPDATERING-mönstret som beskrivs här:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

För referens:

 SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes
 SET counter_field = counter_field + 1; 

...

Så i ditt fall skulle du byta ut

LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
  UPDATE AlarmCount SET num = num - 1 
  WHERE RuleId = OLD.RuleId AND
      MemberId = 0 AND
      IsResolved = OLD.IsResolved;

Med något liknande

SELECT num FROM AlarmCount WHERE RuleId = OLD.RuleId AND
          MemberId = 0 AND
          IsResolved = OLD.IsResolved FOR UPDATE;
UPDATE AlarmCount SET num = num - 1;

Jag säger "något liknande" eftersom det inte är helt klart för mig vad OLD.RuleId och OLD.IsResolved syftar på. Också värt att notera från http://dev.mysql .com/doc/refman/5.0/en/innodb-locking-reads.html är:

UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field +
1); 
SELECT LAST_INSERT_ID();

Med andra ord, du kan förmodligen optimera det här mönstret ytterligare genom att bara komma åt tabellen en gång... men återigen finns det några detaljer om ditt schema som jag inte riktigt följer, och jag är inte säker på att jag skulle kunna ge det faktiska uttalandet du. d behöver. Jag tror dock att om du tar en titt VÄLJ ... FÖR UPPDATERING kommer du att se vad mönstret handlar om och vad du behöver göra för att få detta att fungera i din miljö.

Jag bör också nämna att det finns några lagringsmotormiljöer och transaktionsisoleringsnivåer som du bör överväga. Det finns en mycket, mycket bra diskussion om SO i detta ämne här:När ska man använda SELECT ... FÖR UPPDATERING?

Hoppas detta hjälper!




  1. Välja Största N poster i X grupper

  2. MySQL Pivot Table Head Scratcher

  3. Bör ordningen på LINQ-frågeklausuler påverka Entity Framework-prestanda?

  4. MySQL komplex subquery formulering