Как произвести фантомное чтение?

Использование внешней команды «awk».

%!awk '{print $1,$3,$2,$4}' test.txt 

With pure vim

:%s,\v(\w+) (\w+) (\w+) (\w+),\1 \3 \2 \4,g

Другое решение vim с использованием глобальной команды

:g/./normal wdwwP
23
задан Martin Smith 24 April 2011 в 16:28
поделиться

1 ответ

InnoDB должен защищать от фантомных чтений, как написали другие.

Но InnoDB имеет другое странное поведение, связанное с блокировкой. Когда запрос получает блокировку, он всегда получает блокировку для самой последней версии строки. Поэтому попробуйте следующее

CREATE TABLE foo (i INT PRIMARY KEY, val INT);
INSERT INTO foo (i, val) VALUES (1, 10), (2, 20), (3, 30);

Затем в двух одновременных сеансах (откройте два окна терминала):

-- window 1                               -- window 2
START TRANSACTION;
                                          START TRANSACTION;

                                           SELECT * FROM foo;

 UPDATE foo SET val=35 WHERE i=3;

                                           SELECT * FROM foo;

Это должно показать val = 10, 20, 30 в обоих SELECT, так как REPEATABLE -READ означает, что второе окно видит только те данные, которые существовали на момент начала транзакции.

Однако:

                                           SELECT * FROM foo FOR UPDATE;

Второе окно ожидает получения блокировки в строке 3.

COMMIT;

Теперь SELECT во втором окне завершается и показывает строки с val = 10, 20, 35, потому что блокировка строки приводит к тому, что SELECT видит самую последнюю зафиксированную версию. Операции блокировки в InnoDB действуют так, как будто они выполняются в режиме READ-COMMITTED, независимо от уровня изоляции транзакции.

Вы даже можете переключаться назад и вперед:

                                           SELECT * FROM foo;

                                           SELECT * FROM foo FOR UPDATE;

                                           SELECT * FROM foo;

                                           SELECT * FROM foo FOR UPDATE;
5
ответ дан 29 November 2019 в 02:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: