Mengapa kita tidak mencobanya saja?
Siapkan database
CREATE DATABASE so1;
USE so1;
CREATE TABLE notification (`id` BIGINT(20), `date` DATE, `text` TEXT) ENGINE=InnoDB;
INSERT INTO notification(id, `date`, `text`) values (1, '2011-05-01', 'Notification 1');
INSERT INTO notification(id, `date`, `text`) values (2, '2011-05-02', 'Notification 2');
INSERT INTO notification(id, `date`, `text`) values (3, '2011-05-03', 'Notification 3');
INSERT INTO notification(id, `date`, `text`) values (4, '2011-05-04', 'Notification 4');
INSERT INTO notification(id, `date`, `text`) values (5, '2011-05-05', 'Notification 5');
Sekarang, mulai dua koneksi database
Koneksi 1
BEGIN;
SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;
Koneksi 2
BEGIN;
Jika MySQL mengunci semua baris, pernyataan berikut akan memblokir. Jika hanya mengunci baris yang dikembalikan, seharusnya tidak diblokir.
SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;
Dan memang itu memblokir.
Menariknya, kami juga tidak dapat menambahkan catatan yang akan dibaca, yaitu
INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');
blok juga!
Saya tidak yakin pada titik ini apakah MySQL hanya melanjutkan dan mengunci seluruh tabel ketika persentase tertentu dari baris terkunci, atau di mana sebenarnya sangat cerdas dalam memastikan hasil dari SELECT ... FOR UPDATE
kueri tidak akan pernah dapat diubah oleh transaksi lain (dengan INSERT
, UPDATE
, atau DELETE
) saat kunci ditahan.