ITPub博客

首页 > 数据库 > Oracle > Oracle 数据库隔离级别,特性,问题和解决方法

Oracle 数据库隔离级别,特性,问题和解决方法

原创 Oracle 作者:xingfei80 时间:2012-08-31 18:48:56 0 删除 编辑

引自:http://www.cnblogs.com/1-2-3/archive/2012/04/05/oracle-isolation-level-ora-08177.html

“……老手根本就不会照着指示去做,他边做边取舍,因此必须全神贯注于手上的工作,即使他没有刻意这样做,他的动作和机器之间也自然有一种和谐的感觉。他不需要遵照任何书面的指示,因为手中的机器给他的感觉决定他的思路和动作,同时也影响他手中的工作。所以机器和他的思想同时不断地改变,一直到把事情做好了,他的内心才真正地安宁下来。”
  “听起来好像艺术一样。”
                  ——罗伯特·M.波西格 《禅与摩托车维修艺术》

[@more@]如果没有任何数据库隔离策略,在多用户(多事务)并发时,会产生下列问题:
  - 丢失更新(lost update):两个事务同时更新同一条数据时,会发生更新丢失。
    例如:用户A读取学号为107的学生(学号=107,姓名=“小明”,年龄=28)
    => 用户B读取学号为107的学生(学号=107,姓名=“小明”,年龄=28)
    => 用户A把姓名更改为“王小明”(学号=107,姓名=“王小明”,年龄=28)
    => 用户B把年龄更改为33(学号=107,姓名=“小明”,年龄=33)
    => 用户A提交(学号=107,姓名=“王小明”,年龄=28)
    => 用户B提交(学号=107,姓名=“小明”,年龄=33)
    用户A对学生姓名的更新丢失了。
  - 脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
    例如:用户A读取学号为107的学生(学号=107,姓名=“小明”,年龄=28)
    => 用户A把姓名更改为“王小明”(学号=107,姓名=“王小明”,年龄=28)
    => 用户B读取学号为107的学生(学号=107,姓名=“王小明”,年龄=28)
    => 用户A撤销更改,事务回滚(学号=107,姓名=“小明”,年龄=28)
    这样用户B相当于读取了一个从未存在过的数据“王小明”。如果涉及到金额的话问题更为严重,因为用户B读取了一个金额之后,很可能把这个金额与其它金额累加,再把结果保存到汇总数据之中,这样在月底对不上账的时候,由于用户A回滚了事务,数据库内不会有任何操作记录,这样用户B是何时、从哪里读取了错误数据根本无从查起。
  - 不可重现的读取(nonrepeatable read):同一查询在同一事务中多次进行,在此期间,由于其他事务提交了对数据的修改或删除,每次返回不同的结果。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14663377/viewspace-1059305/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-07-14

  • 博文量
    102
  • 访问量
    492759