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

Kebuntuan pada MySQL menghapus baris

Saat melakukan DML operasi, InnoDB mengunci semua baris yang dipindai, tidak cocok.

Pertimbangkan tata letak tabel ini:

DROP TABLE t_tran;

CREATE TABLE t_tran (id INT NOT NULL PRIMARY KEY, data INT NOT NULL, KEY ix_tran_data (data)) Engine=InnoDB;

DROP TABLE t_tran;

CREATE TABLE t_tran (id INT NOT NULL PRIMARY KEY, data INT NOT NULL, KEY ix_tran_data (data)) Engine=InnoDB;

INSERT
INTO    t_tran
VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 4),
(5, 5),
(6, 6),
(7, 7),
(8, 8);

START TRANSACTION;

DELETE
FROM    t_tran
WHERE   data = 2
        AND id <= 5;

Dalam hal ini, MySQL memilih RANGE jalur akses di id , yang dianggap lebih murah daripada REF pada data .

Dalam transaksi bersamaan, Anda akan dapat menghapus atau memperbarui baris 6 , 7 , 8 tapi bukan baris 1 ke 5 karena terkunci (meskipun faktanya hanya baris 2 terpengaruh).

Jika Anda menghapus id <= 5 dari kondisi di atas, Anda dapat menghapus baris apa pun kecuali baris 3 .

Sayangnya, Anda tidak dapat mengontrol MySQL jalur akses di DML operasi.

Yang terbaik yang dapat Anda lakukan adalah mengindeks kondisi Anda dengan benar dan berharap MySQL akan memilih indeks ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Koneksi Basis Data tidak terlepas setelah waktu idle habis di glassfish

  2. Mengapa sesi panggilan tidak berfungsi? (penyala kode 3)

  3. Pernyataan PDO saya tidak berfungsi

  4. Laravel Eloquent menemukan pengembalian null

  5. Kolom tidak dikenal dalam kesalahan 'daftar bidang' pada permintaan Pembaruan MySQL