Saya pikir cara terbaik untuk menangani ini adalah dengan menggunakan pola SELECT ... FOR UPDATE yang dijelaskan di sini:http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
Untuk referensi:
SELECT counter_field FROM child_codes FOR UPDATE; UPDATE child_codes
SET counter_field = counter_field + 1;
...
Jadi dalam kasus Anda, Anda akan mengganti
LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved;
Dengan sesuatu seperti
SELECT num FROM AlarmCount WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved FOR UPDATE;
UPDATE AlarmCount SET num = num - 1;
Saya mengatakan "sesuatu seperti" karena tidak sepenuhnya jelas bagi saya apa yang dimaksud dengan OLD.RuleId dan OLD.IsResolved. Juga perlu diperhatikan dari http://dev.mysql .com/doc/refman/5.0/en/innodb-locking-reads.html adalah:
UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field +
1);
SELECT LAST_INSERT_ID();
Dengan kata lain, Anda mungkin dapat mengoptimalkan pola ini lebih lanjut dengan hanya mengakses tabel sekali... tetapi sekali lagi ada beberapa detail tentang skema Anda yang tidak saya ikuti, dan saya tidak yakin saya dapat memberikan pernyataan sebenarnya yang Anda' perlu. Saya pikir jika Anda melihat SELECT ... FOR UPDATE, Anda akan melihat inti dari pola tersebut, dan apa yang perlu Anda lakukan untuk membuat ini bekerja di lingkungan Anda.
Saya juga harus menyebutkan bahwa ada beberapa lingkungan mesin penyimpanan dan tingkat isolasi transaksi yang ingin Anda pertimbangkan. Ada diskusi yang sangat, sangat bagus tentang SO tentang topik ini di sini:Kapan menggunakan SELECT ... FOR UPDATE?
Semoga ini bisa membantu!