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!