Код: Выделить всё
CREATE TABLE table1 (
name VARCHAR(100) NOT NULL,
INDEX idx_table1_name (name)
);
CREATE TABLE table2 (
name VARCHAR(100) NOT NULL,
INDEX idx_table2_name (name)
);
транзакция 1:
Код: Выделить всё
START TRANSACTION;
SELECT * FROM table1
WHERE name = (
SELECT name FROM table2 WHERE name = 'a'
) FOR UPDATE;
Код: Выделить всё
START TRANSACTION;
INSERT INTO table2 VALUES ('b');
COMMIT;
Код: Выделить всё
SELECT * FROM table2 WHERE name = 'b';
-- returns EMPTY SET
Case 2: INSERT INTO ... SELECT with subquery
Transaction 1:
Код: Выделить всё
START TRANSACTION;
INSERT INTO table1
SELECT 'c' FROM table2 WHERE name = 'a';
Код: Выделить всё
START TRANSACTION;
INSERT INTO table2 VALUES ('b');
COMMIT;
SELECT * FROM table2 WHERE name = 'b';
-- returns 'b'
< /code>
Это означает, что вставка не было создано, и он может рассматривать совершенные данные из транзакции 2.
Согласно этой странице, обычный выбор ... для обновления рассматривается как операция DML, а не как обычный выбор. />[*]https://dev.mysql.com/doc/refman/8.4/en ... -read.html
Вопросы
Почему выбирает обновленную информацию с помощью Snapshot? Является ли вставка в ... выберите не создавать снимок на одном и том же уровне изоляции чтения?>
Подробнее здесь: https://stackoverflow.com/questions/796 ... sql-but-in