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

[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]


-
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值