任何人都可以解释一下在事务DB中不可序列化的内容。请举个例子。 r1(x)r2(x)w1(y)c2 c1是不可序列化的?
答案 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
的
可序列化的事务使数据库处于与事务开始时完全相同的状态,除了事务本身所做的更改。