什么是不可序列化的时间表?在事务数据库中

时间:2010-02-17 16:28:18

标签: database transactions information-retrieval

任何人都可以解释一下在事务DB中不可序列化的内容。请举个例子。 r1(x)r2(x)w1(y)c2 c1是不可序列化的?

1 个答案:

答案 0 :(得分:3)

想象一下这个表(在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

可序列化的事务使数据库处于与事务开始时完全相同的状态,除了事务本身所做的更改。