Myslím, že nejlepší způsob, jak to zvládnout, by bylo použít vzor SELECT ... FOR UPDATE popsaný zde:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
Pro informaci:
SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes
SET counter_field = counter_field + 1;
...
Takže ve vašem případě byste nahradili
LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved;
S něčím jako
SELECT num FROM AlarmCount WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved FOR UPDATE;
UPDATE AlarmCount SET num = num - 1;
Říkám „něco jako“, protože mi není úplně jasné, co OLD.RuleId a OLD.IsResolved odkazují. Za zmínku také stojí http://dev.mysql .com/doc/refman/5.0/en/innodb-locking-reads.html je:
UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field +
1);
SELECT LAST_INSERT_ID();
Jinými slovy, pravděpodobně můžete tento vzor dále optimalizovat tak, že k tabulce přistoupíte pouze jednou... ale opět je zde několik podrobností o vašem schématu, které úplně nesleduji, a nejsem si jistý, zda mohu poskytnout skutečné prohlášení, které uvádíte. d potřebovat. Myslím si, že když se podíváte na VYBRAT... PRO AKTUALIZACI, uvidíte, na co se vzorec scvrkává a co musíte udělat, aby to ve vašem prostředí fungovalo.
Měl bych také zmínit, že existují určité úrovně prostředí úložiště a izolace transakcí, které budete chtít zvážit. Na toto téma je velmi, velmi dobrá diskuse o SO na toto téma zde:Kdy použít SELECT... FOR UPDATE?
Doufám, že to pomůže!