sql >> Databáze >  >> RDS >> Mysql

Při použití zamykání FOR UPDATE MySQL, co je přesně zamčeno?

Proč to prostě nezkusíme?

Nastavte databázi

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

Nyní spusťte dvě databázová připojení

Připojení 1

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

Připojení 2

BEGIN;

Pokud MySQL zamkne všechny řádky, zablokuje se následující příkaz. Pokud zamyká pouze řádky, které vrací, nemělo by blokovat.

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

A skutečně blokuje.

Zajímavé je, že také nemůžeme přidávat záznamy, které by byly čteny, tj.

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

bloky také!

V tuto chvíli si nejsem jistý, zda MySQL prostě pokračuje a zamkne celou tabulku, když je zamknuto určité procento řádků, nebo kde je skutečně opravdu inteligentní při zajištění výsledku SELECT ... FOR UPDATE dotaz nelze nikdy změnit jinou transakcí (pomocí INSERT , UPDATE nebo DELETE ), zatímco je zámek držen.



  1. Převeďte výsledky dotazu na seznam oddělený čárkami v MariaDB

  2. SQLSTATE[HY000] [1040] Příliš mnoho připojení

  3. SQL cast datetime

  4. Jak získat záznamy za posledních 15 dní v MySQL