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

INSERT ... PILIH, InnoDB dan penguncian

Itu benar. Baris dalam tabel yang sedang dibaca dikunci dengan kunci bersama (SELECT secara implisit LOCK IN SHARE MODE ). Tidak ada cara untuk menghindari ini. Ini semacam apa yang Anda minta dari sistem:salin semua baris yang cocok dengan suatu kondisi. Satu-satunya cara untuk memastikan bahwa sebenarnya semua baris yang cocok dengan kondisi dan daftar itu tidak berubah selama atau segera setelah eksekusi pernyataan itu, adalah dengan mengunci baris.

Sebagai klarifikasi tentang mengapa Anda tidak dapat INSERT dengan group_id = 2 :

Ini ada hubungannya dengan kueri Anda yang secara khusus WHERE group_id = 3 AND created < '2014-01-04' pada KEY group_id_created (group_id, created) . Untuk mencari semua baris yang cocok dengan group_id = 3 AND created < '2014-01-04' indeks akan dilintasi mundur dimulai dari baris pertama yang melebihi kondisi batas atas tersebut, yaitu (3, '2014-01-14') dan terus sampai menemukan baris yang tidak sesuai dengan kondisi, yang sejak created tidak memiliki batas bawah akan menjadi baris pertama di mana group_id < 3 yang tentunya group_id = 2 .

Itu berarti baris pertama bertemu dengan group_id = 2 adalah juga terkunci, yang akan menjadi baris dengan maksimum created nilai. Ini akan membuat tidak mungkin untuk INSERT ke dalam "celah" antara (2, MAX(created)) dan (3, MIN(created)) (tentu saja bukan SQL yang tepat, hanya pseudo-SQL), meskipun ini bukan "kunci celah" secara khusus.




  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 workbench :Bagaimana cara mengekspor database mysql ke file .sql?

  2. Cara Menggunakan Peran yang Telah Berubah di MySQL 8.0

  3. Saya tidak sengaja mengunci root di MySQL

  4. Menambahkan dan mengakses ID tombol dalam tabel yang dibuat oleh PHP

  5. Ekspor tabel MySQL besar sebagai beberapa file yang lebih kecil