2010-02-17 13 views

回答

3

想象一下这个表(Oracle):

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

,并发出以下查询:

-- session 1 
UPDATE t_series 
SET  value = 1 
WHERE value = 2 
/
COMMIT 
/

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交易,那么:

-- 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 

,我。即这些查询将只交换的

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

相关问题