sql >> Database >  >> RDS >> Mysql

Wat is er precies vergrendeld bij het gebruik van MySQL's FOR UPDATE-vergrendeling?

Waarom proberen we het niet gewoon?

De database instellen

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');

Start nu twee databaseverbindingen

Verbinding 1

BEGIN;
SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;

Verbinding 2

BEGIN;

Als MySQL alle rijen vergrendelt, blokkeert de volgende instructie. Als het alleen de rijen vergrendelt die het retourneert, zou het niet moeten blokkeren.

SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;

En inderdaad, het blokkeert.

Interessant is dat we ook geen records kunnen toevoegen die zouden worden gelezen, d.w.z.

INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');

blokken ook!

Ik weet op dit moment niet zeker of MySQL gewoon doorgaat en de hele tabel vergrendelt wanneer een bepaald percentage rijen is vergrendeld, of waar het echt intelligent is om ervoor te zorgen dat het resultaat van de SELECT ... FOR UPDATE query kan nooit worden gewijzigd door een andere transactie (met een INSERT , UPDATE , of DELETE ) terwijl het slot wordt vastgehouden.



  1. De verbindingspool voor database '/data/data/msv_database.db' heeft geen verbinding kunnen maken. Verbindingen:0 actief, 1 inactief, 0 beschikbaar

  2. ML{.NET} Inleiding

  3. 13 blogartikelen over best practices en tips voor databaseontwerp

  4. MySQL:index json-arrays van variabele lengte?