Конкурентный доступ

fgh's picture

Рассмотрим пример работы блокировки строк, для этого создаем таблицу и сразу заполняем данными её:

Откроем первое окно командной строки.

Ctrl+Alt+T

Создадим в первом окне новую базу данных:

CREATE TABLE table1 (
a INT NOT NULL,
b INT NOT NULL ,
c INT NOT NULL ,
d INT NOT NULL);
INSERT INTO table1 (a,b,c,d) VALUES (1,2,3,4);
INSERT INTO table1 (a,b,c,d)  VALUES (5,6,7,8);
INSERT INTO table1(a,b,c,d)   VALUES (9,10,11,12);
INSERT INTO table1 (a,b,c,d)   VALUES (13,14,15,16);
INSERT INTO table1 (a,b,c,d)   VALUES (17,18,19,20);
INSERT INTO table1 (a,b,c,d)  VALUES (21,22,23,24);
INSERT INTO table1  (a,b,c,d)  VALUES (25,26,27,28);
SELECT * FROM table1;

Теперь откроем в первом окне транзакцию (с режимом блокировки DEFFERED):

BEGIN DEFFERED TRANSACTION;

Теперь откроем второе окно командной строки. И обратимся к этой же базе данных:

Ctrl+Alt+T

 
USE table1;
SELECT * FROM table1; 

Мы можем увидеть, что параллельный, второй сеанс обращения к базе данных позволяет читать данные. Теперь попробуем вставить данные из второго окна:

INSERT INTO table1  (a,b,c,d)  VALUES (1,234,34,45);

Видим, что можем из второго окна вставлять данные.

Теперь в первом окне выведем данные таблицы:

 
SELECT * FROM table1; 

После чего во втором окне обращаемся к базе данных:

INSERT INTO table1  (a,b,c,d)  VALUES (31,6,2, 8);

Видим, что во втором окне появилась ошибка:

Error: databse is locked

Это и есть пример блокировки строк в параллельном запросе.

Источники:
1) mysql deadlocks & lock wait timeouts -- что означают. Блокировки и транзакции
2) Блокировки в MySQL
3) SQL запросы. Режимы блокировки базы данных: как выполняются параллельные транзакции.
4) 6.7.2 Синтаксис команд LOCK TABLES/UNLOCK TABLES
5 ) На английском (Optimizing Locking Operations)

Чем отличается параллельность, от конкурентности и так далее (на английском)