欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-14 17:10:07
...
[color=green][size=medium][b]数据库之事务之并发:脏读,不可重复读,幻读[/b][/size][/color]

[size=medium][b]一、现象描述[/b][/size]

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


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

案例:
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.


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

案例:
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.


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

案例:
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.



[size=medium][b]二、解决方法[/b][/size]

[b]隔离(数据库系统)[/b]
Isolation (database systems)


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

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

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

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


[b]Isolation Levels vs Read Phenomena[/b]


/*
---------------------------------------------------------------------
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 | - | - | -
---------------------------------------------------------------------
*/



[b]数据库提供的事务隔离等级 与 读取数据时可能产生的问题[/b]

/*
---------------------------------------------------------------------
事务隔离等级 | 脏读 | 不可重复读 | 幻读
-----------------+-------------+----------------------+--------------
Read Uncommitted | 可能发生 | 可能发生 | 可能发生
-----------------+-------------+----------------------+--------------
Read Committed | - | 可能发生 | 可能发生
-----------------+-------------+----------------------+--------------
Repeatable Read | - | - | 可能发生
-----------------+-------------+----------------------+--------------
Serializable | - | - | -
---------------------------------------------------------------------
*/



引用:
-

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

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

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

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


-