Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pemicu dan kunci tabel di MySQL

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!




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql like% query lambat dengan indeks teks lengkap

  2. Cara menutup koneksi sqlalchemy di MySQL

  3. Pengembangan tautan admin WordPress mengarahkan ke situs langsung

  4. Tabel dengan 80 juta catatan dan menambahkan indeks membutuhkan waktu lebih dari 18 jam (atau selamanya)! Sekarang apa?

  5. Bagaimana cara menggunakan gabungan penuh luar di laravel 5.0?