WEB开发网
开发学院数据库Oracle 在Oracle中使用锁进行并发控制 阅读

在Oracle中使用锁进行并发控制

 2009-03-12 13:10:47 来源:WEB开发网   
核心提示: 不可重复读 还是事务T1和T2,它们都是要更新quantity列,在Oracle中使用锁进行并发控制(2),T1将该列值加100,T2将此列减10,Read Only隔离级别不是SQL92标准中定义的,它不允许事务进行更新操作,而且两个事务都成功,我们很容易计算出正确的结果20+100-1

不可重复读

还是事务T1和T2,它们都是要更新quantity列,T1将该列值加100,T2将此列减10,而且两个事务都成功。我们很容易计算出正确的结果20+100-10=110,但是如果事务按照以下方式运行,能够得出什么结果?

时间   事务   步骤                             存储值

1      T1     读出quantity的值                20

2      T2     读出quantity的值               20

3      T1     quantity=20+100                  120

4      T2     quantity=20-10                  10

5      T1     写入quantity值(更新丢失)          110

6      T2     写入quantity值                  10

得出了10的结果,仍然是不正确的。问题就在于T2的值覆盖了T1的值,我们把这种情况称之为不可重复读。

幻觉读

例如T1对一个表中的所有行修改,同时T2向该表中插入一行记录。这时在T1中就会发生还有没有被修改的数据行,就好象发生了幻觉一样。

SQL92标准定义了四种隔离级别,以解决以上问题,四种隔离级别如下图所示:

在Oracle中使用锁进行并发控制  

Oracle提供了三种隔离级别,分别是Read Committed Serializable和Read Only。Read Committed是Oracle的默认隔离级别,可以看出这种隔离级别消除了脏读,但是避免不了不可重复读和幻觉读的发生,不过一般的应用还是可以使用该隔离级别的。Serializable这种隔离级别可以消除以上三个问题,但是效率会降低很多。Read Only隔离级别不是SQL92标准中定义的,它不允许事务进行更新操作,这种隔离级别也可以消除脏读。

上一页  1 2 3 4  下一页

Tags:Oracle 使用 进行

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接