1

谁能解释一下事务数据库中什么是不可序列化的。请给我一个例子。r1(x) r2(x)w1(y) c2 c1 这是不可序列化的吗?

4

1 回答 1

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

如果我们对SERIALIZABLElevel 做同样的事情,结果将是这样的:

id   value
1    2
2    1

,即查询只会交换value's

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

于 2010-02-17T16:50:01.670 回答