引自: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/
,如需转载,请注明出处,否则将追究法律责任。