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

Apakah INSERT IGNORE mengunci tabel meskipun itu mengabaikan sisipan?

Itu tergantung pada mesin - MyIsam dan InnoDb berperilaku berbeda.

Untuk tabel MyIsam, jika record sudah ada di tabel (bahkan jika belum di-commit), INSERT reguler dari record yang sama ( kunci unik yang sama) di sesi lain melaporkan kesalahan kunci duplikat - jadi INSERT IGNORE mengabaikan kesalahan dan melanjutkan lebih jauh.

Pada tabel InnoDB, jika catatan tidak dikunci, INSERT biasa akan segera laporkan kesalahan kunci duplikat (INSERT IGNORE akan melewatkan kesalahan dan melanjutkan).
Tetapi jika catatan dikunci oleh sesi lain (misalnya catatan dimasukkan tetapi belum dikomit, atau catatan dikunci oleh UPDATE atau DELETE atau SELECT FOR UPDATE perintah), perintah INSERT akan "hang" dan akan menunggu sampai sesi lain akan menghapus kunci (dengan COMMIT atau ROLLBACK). Kemudian, jika record masih ada setelah kunci dilepas, INSERT akan melaporkan kesalahan (INSERT IGNORE akan mengabaikan kesalahan), tetapi jika record tidak ada, INSERT akan menambahkan record ini ke tabel.

Kata kunci IGNORE hanya mengatakan "jika ada kesalahan, abaikan saja, teruskan", tetapi itu tidak memengaruhi perilaku penguncian.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perl DBI fetchall_hashref

  2. Konversikan file BibTex ke entri database menggunakan Python

  3. Jatuhkan kunci asing hanya jika ada

  4. Ganti null dengan 0 di MySQL

  5. Adakah gunanya menggunakan LIMIT dalam kueri EXISTS?