数据库之事务之并发:脏读,不可重复读,幻读

数据库之事务之并发:脏读,不可重复读,幻读

一、现象描述

数据库事务并发产生的问题,现象有以下三种:


第一种现象: 脏读:
    描述:在一次事务中,读取了另一个尚未提交事务正在修改的数据。
    原因:该数据正在被另外的事务修改,数据的最终结果不能确定,就读取了数据。
    强调:争夺已被其它事务占用的某行资源。
    解决:对数据枷锁。
         不要读取正在被其它事务修改的数据。

    案例:
        1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)        
        2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
        3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000。
        4.像这样,Mary记取的工资数8000是一个脏数据。

-
dirty read

A dirty read occurs when a transaction is allowed to read data from a row that
has been modified by another running transaction and not yet committed.



第二种现象: 不可重复读
    描述:在一次事务中,某行被读取两次,前后结果不一致的现象。
    原因:在事务第一次读取数据后,有另外的事务更新了数据。
    强调:某行资源被其它事务争夺。
    解决:对数据加锁。事务访问数据时,需要获取数据的锁。
        第一个事务未提交(释放锁),不允许其它事务访问数据。

    案例:
        1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
        2.在事务2中,这时财务人员修改了Mary的工资为8000,并提交了事务.
        3.在事务1中,Mary 再次读取自己的工资时,工资变为了8000
        4.这种现象发生在一个事务中需要多次读取某行数据的情况下。
-
non-repeatable read

A non-repeatable read occurs, when during the course of a transaction,
a row is retrieved twice and the values within the row differ between reads.




第三种现象: 幻读
    描述:在一次事务中,对多行集合的查询被执行两次,前后结果不一致的现象。
    原因:在事务第一次查询后,有另外的事务修改了数据(增删改)
    强调:多行资源
    解决:对事务加锁或对整个表加锁。此种情况下,对行加锁已不起作用。
        第一个事务未提交,不允许其它事务执行。

    案例:
        1.事务1,读取所有工资为1000的员工,共10人。
        2.事务2,向表中插入了一条员工记录,工资也为1000。
        3.事务1,再次读取所有工资为1000的员工 共读取到了11条记录。
        4.这种现象发生在对数据库的操作涉及到多行时。(比如条件查询语句)
-
phantom read

A phantom read occurs when, in the course of a transaction,
two identical queries are executed, and the collection of rows returned
by the second query is different from the first.
   



二、解决方法

隔离(数据库系统)
Isolation (database systems)


在数据库系统中,隔离确定事务完整性对其他用户和系统的可见性。
例如,当用户正在创建采购订单并创建了头部但未创建采购订单行时,
该头部是否对其他系统/用户可用,执行并发操作(例如采购订单报告),可见?

较低的隔离级别增加了许多用户同时访问数据的能力,但增加了用户可能遇到的并发效应(例如脏读或丢失更新)的数量。
相反,更高的隔离级别减少了用户可能遇到的并发效应的类型,但需要更多的系统资源,并增加了一个事务将阻止另一个事务的机会。

隔离通常在数据库级别定义为定义如何/何时由一个操作变更对其他操作可见的属性。
在较旧的系统上,可以系统地实现,例如通过使用临时表。
在两层系统中,需要一个事务处理(Transaction Processing)管理器来维护隔离。
在n层系统(如尝试预订航班最后一个座位的多个网站)中,需要存储过程和事务管理的组合来提交预订并向客户发送确认。

隔离是ACID(Atomicity,Consistency,Isolation,Durability)属性之一




Isolation Levels vs Read Phenomena

/*
---------------------------------------------------------------------
Isolation level	 | Dirty reads | Non-repeatable reads | Phantoms
-----------------+-------------+----------------------+--------------
Read Uncommitted |	may occur  | may occur            | may occur
-----------------+-------------+----------------------+--------------
Read Committed	 |  -          | may occur            | may occur   
-----------------+-------------+----------------------+--------------
Repeatable Read	 |	-	       | -                    | may occur
-----------------+-------------+----------------------+--------------
Serializable	 |  -	       | -                    |	-
---------------------------------------------------------------------
*/



数据库提供的事务隔离等级 与 读取数据时可能产生的问题
/*
---------------------------------------------------------------------
事务隔离等级   	 | 脏读         | 不可重复读              | 幻读
-----------------+-------------+----------------------+--------------
Read Uncommitted | 可能发生      | 可能发生               | 可能发生
-----------------+-------------+----------------------+--------------
Read Committed	 |  -          | 可能发生               | 可能发生
-----------------+-------------+----------------------+--------------
Repeatable Read	 |	-	       | -                    | 可能发生
-----------------+-------------+----------------------+--------------
Serializable	 |  -	       | -                    |	-
---------------------------------------------------------------------
*/









引用:
-

https://en.wikipedia.org/wiki/Isolation_(database_systems)

数据库中的-脏读,幻读,不可重复读
http://blog.csdn.net/d8111/article/details/2595635

事务隔离级别
http://www.iteye.com/topic/332577

脏读、幻读和不可重复读 + 事务隔离级别
http://uule.iteye.com/blog/1109647











-

猜你喜欢

转载自lixh1986.iteye.com/blog/2366395