У меня одна таблица в движке InnoDB выглядит так:
CREATE TABLE `sample` (
`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`unique_str` varchar(255) NOT NULL
);
ALTER TABLE `sample`
ADD UNIQUE `unique_str_index` (`unique_str`);
Как видите, эта таблица имеет уникальный индекс в столбце "unique_str".
Например, я хочу запустить два скрипта с транзакциями один за другим.
//First script, i use pdo for connection
$pdo->beginTransaction();
$pdo->exec("INSERT INTO sample (unique_str) VALUES('first')");
$pdo->exec("INSERT INTO sample (unique_str) VALUES('violate_str')");
sleep(50); //I'll start second script here
$pdo->commit();
Я запущу второй скрипт, когда первый скрипт спит в течение 50 секунд.
//Second script
$pdo->beginTransaction();
$pdo->exec("INSERT INTO sample (unique_str) VALUES('third')");
$pdo->exec("INSERT INTO sample (unique_str) VALUES('violate_str')");
$pdo->commit();
Во втором скрипте PHP застрянет на самой первой строке с командой «insert» и будет ждать, пока транзакция в первом скрипте будет зафиксирована. Когда первый скрипт выйдет из спящего режима и зафиксирует транзакцию, в таблице создадутся две новые строки («first» и «violate_str») и второй скрипт снова начнет работать: второй скрипт проделает две вставки, но при второй вставке ('violate_str') будет сгенерировано исключение.
Мой вопрос: "почему PHP ждет завершения первой транзакции и не работает на этот раз? MySQL блокирует вторую транзакцию? Почему?". Я думаю, что у меня есть некоторое непонимание принципов работы транзакций. Я думал, что транзакции будут создаваться одна за другой и вторая транзакция не будет заблокирована.
Engine = InnoDB
к операторуCREATE TABLE
- person Raymond Nijland   schedule 04.05.2019