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

Saat menggunakan penguncian FOR UPDATE MySQL, apa yang sebenarnya dikunci?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara membuat CakePHP bake untuk menemukan mysql.sock dan mengenali MySQL saat menggunakan MAMP di Mac OSX?

  2. MySQL 5.5.9 dan kesalahan pembuatan tabel Hibernate pada TYPE

  3. MySQL:SUM() dengan JOIN mengembalikan nilai yang salah

  4. Bagaimana cara mengunci database mysql secara eksklusif?

  5. Pembaruan MySQL atau Ganti Nama Kunci di JSON