您现在的位置: 万盛学电脑网 >> 程序编程 >> 数据库 >> oracle教程 >> 正文

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

作者:佚名    责任编辑:admin    更新时间:2022-06-22

现在主流的数据库管理系统中,都支持多个事务同时执行,这样提高了数据库管理系统的运行效率。试想如果只允许一个事务运行,而这个事务又需要很长的时间,那么其他的用户必须一直等待该事务结束,效率何其低下。执行不同的事务虽然可以提高性能,但是有可能会破坏数据的完整性,所以我们必须在性能和数据完整性之间进行权衡。那么什么是并发控制呢?并发控制是数据库管理系统协调多个运行事务的行为。首先了解一下,并发控制中经常遇到的三个问题。

脏读

我们通过一个products表来解释一下什么是脏读,该products表有一列quantity(数量),现在的值为20。假如现在有两个事务T1和T2,它们都是要更新quantity列,T1将该列值加100,T2将此列减10,但是T1执行失败进行了回滚。我们很容易计算出正确的结果20-10=10,但是如果事务按照以下方式运行,能够得出什么结果?

时间   事务   步骤                 存储值

1      T1     读出quantity的值         20

2      T1      quantity=20+100        120

3      T1      写入quantity值         120

4      T2      读出quantity(T1未提交)     120

5      T2      quantity=120-10        110

6      T1      回滚(rollback)          20

7      T2      写入quantity值         110

以上得出了110的结果,显然是不正确的,问题就在于T2读取到了T1没有提交的数据,我们把这种情况就称之为脏读。

不可重复读

还是事务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标准定义了四种隔离级别,以解决以上问题,四种隔离级别如下图所示:

  • 共2页:
  • 上一页
  • 1
  • 2
  • 下一页