Представьте себе эту таблицу (в Oracle
):
CREATE TABLE t_series (id INT NOT NULL PRIMARY KEY, value INT NOT NULL)
INSERT
INTO t_series
VALUES (1, 1)
INSERT
INTO t_series
VALUES (2, 2)
Теперь мы запускаем две READ COMMITTED
транзакции в двух сеансах:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
и выполните следующие запросы:
-- session 1
UPDATE t_series
SET value = 1
WHERE value = 2
/
COMMIT
/
, а затем:
-- session 2
UPDATE t_series
SET value = 2
WHERE value = 1
/
COMMIT
/
Результат будет таким:
id value
1 2
2 2
, т.е. е. обе записи будут иметь value = 2
В первом запросе обе записи имели value = 1
, во втором запросе эти изменения были внесены и обе записи имели value = 2
.
Если бы мы сделали то же самое с уровнем SERIALIZABLE
, результат был бы следующим:
id value
1 2
2 1
, т.е. е. запросы просто поменяют value
s
Сериализуемая транзакция видит базу данных в том же состоянии, в каком она была в начале транзакции, за исключением изменений, внесенных самой транзакцией.