一、现象描述
数据库事务并发产生的问题,现象有以下三种:
第一种现象: 脏读:
描述:在一次事务中,读取了另一个尚未提交事务正在修改的数据。
原因:该数据正在被另外的事务修改,数据的最终结果不能确定,就读取了数据。
强调:争夺已被其它事务占用的某行资源。
解决:对数据枷锁。
不要读取正在被其它事务修改的数据。
案例:
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
-