Что такое несериализуемый график? в базе данных транзакций - PullRequest
1 голос
/ 17 февраля 2010

Может кто-нибудь объяснить мне, что не является сериализуемым в БД транзакций. пожалуйста, дайте мне пример. r1 (x) r2 (x) w1 (y) c2 c1 это не сериализуемо?

1 Ответ

3 голосов
/ 17 февраля 2010

Представьте себе эту таблицу (в 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

Сериализуемая транзакция видит базу данных в том же состоянии, в каком она была в начале транзакции, за исключением изменений, внесенных самой транзакцией.

...