数据库之事务之并发:脏读,不可重复读,幻读
一、现象描述
数据库事务并发产生的问题,现象有以下三种:
第一种现象: 脏读:
描述:在一次事务中,读取了另一个尚未提交事务正在修改的数据。
原因:该数据正在被另外的事务修改,数据的最终结果不能确定,就读取了数据。
强调:争夺已被其它事务占用的某行资源。
解决:对数据枷锁。
不要读取正在被其它事务修改的数据。
案例:
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://www.iteye.com/blog/lixh1986-2366395
引用:
-
https://en.wikipedia.org/wiki/Isolation_(database_systems)
事务ACID理解 + 事务的隔离级别 + 脏读 + 不可重复读 + 幻读
https://blog.csdn.net/dengjili/article/details/82468576
数据库中的-脏读,幻读,不可重复读
http://blog.csdn.net/d8111/article/details/2595635
事务隔离级别
http://www.iteye.com/topic/332577
脏读、幻读和不可重复读 + 事务隔离级别
http://uule.iteye.com/blog/1109647
-
分享到:
相关推荐
在事务并发处理中,存在三种类型的问题:脏读、不可重复读和虚读。 脏读(Dirty Read)是指事务读取了另一个事务未提交的数据。如果第一个事务回滚了修改操作,那么第二个事务读取的数据就可以看作是从未存在过的。...
并发控制的主要目标是避免事务之间的冲突,防止出现诸如脏读、不可重复读和幻读等问题。 脏读发生在事务T1读取了事务T2还未提交的修改数据,然后T2因为某种原因回滚了更改。在这种情况下,T1读到的数据实际上是错误...
脏读、不可重复读和幻读都是在事务隔离性不足的情况下可能出现的问题。 1. **脏读**(Dirty Read): - **定义**:当一个事务正在访问数据,并对该数据进行了修改,但这种修改还没有提交到数据库中时,另一个事务...
1. 读未提交(Read Uncommitted):允许读取未提交的数据,可能导致脏读、不可重复读、幻读。 2. 读提交(Read Committed):仅能读取已提交的数据,避免脏读,但仍可能遇到不可重复读和幻读。 3. 可重复读...
标题和描述中提到的核心知识点是关于数据库事务并发控制中可能出现的问题,特别是脏写(Dirty Write)和脏读(Dirty Read)两种现象。这些知识点主要涉及数据库事务的隔离级别,事务的ACID属性(原子性、一致性、...
隔离性使不同事务之间操作互不影响,防止脏读、不可重复读和幻读等问题;持久性则指事务一旦提交,其结果就会永久保存,即使系统故障也能恢复。 SQL Server 2005提供了多种类型的事务,包括系统事务和用户定义事务...
幻读是数据库事务并发控制中的一种现象,它是指在一个事务中,当使用相同的SQL语句多次查询时,由于其他事务对数据的插入或者修改,导致前后读取到的数据行数发生变化,仿佛出现了幻觉。为了深入理解幻读,我们首先...
数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。 事务的4大特性(ACID): 1、原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么...
该资源详细介绍了MySQL数据库中的事务隔离级别,包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable),并讨论了这些级别如何影响脏读、不可重复读...
8. **并发问题处理**:死锁、脏读、不可重复读和幻读是并发环境下常见的问题。Hibernate通过事务和锁机制帮助开发者避免这些问题。 9. **实体状态与生命周期**:理解Hibernate中的临时态、持久态、瞬时态和脱管态...
2. **事务隔离级别选择**:数据库通常提供四种隔离级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。不同隔离级别对并发性和一致性有不同的...
- 描述:最低级别的隔离,允许读取未提交的更改,可能会遇到脏读、不可重复读和幻读等问题。 - 示例:如果事务A修改了数据但未提交,事务B能够读取到这些更改。 2. **读已提交(Read Committed)**: - 描述:不...
4. **串行化(Serializable)**:最严格的隔离级别,所有事务按顺序执行,可以完全避免脏读、不可重复读和幻读,但性能最低,因为事务必须等待前面的事务完成。 数据库系统通过多种技术实现这些隔离级别,如锁定...
并发控制的主要目标是防止多个事务在执行过程中产生冲突,例如丢失更新、脏读、不可重复读和幻读等问题。以下是一些关键知识点: 1. **事务**: 事务是数据库操作的基本单位,具有原子性、一致性、隔离性和持久性...
在并发事务运行中可能会出现一些异常问题,例如丢失更新、不可重复读和读“脏”数据。丢失更新是指两个事务同时读取同一数据并修改,导致其中一个事务的修改被丢失。不可重复读是指事务 T1 读取数据后, T2 对同一...
3. 可重复读(Repeatable Read):这个级别防止了脏读和不可重复读,但在某些情况下仍可能出现幻读。事务可以在整个事务期间多次读取同一条记录,始终得到相同的结果,除非其他事务在该事务期间对这些记录进行了修改...
并发操作可能引发的问题包括数据丢失、脏读、不可重复读和幻读。例如,一个事务读取到另一个事务未提交的数据,称为脏读;一个事务在两次读取同一数据时,结果不一致,即发生了不可重复读;幻读则是在同一事务内多次...
并发操作可能会产生三类数据不一致性:丢失修改、不可重复读和读‘脏’数据。这些不一致性都是由于并发操作破坏了事务的隔离性所引起的。 三、封锁类型 封锁是指一个事务对某个数据对象加锁,取得对它一定的控制,...
3. **隔离性**:并发执行的事务之间应相互隔离,如同串行执行一样,避免出现脏读、不可重复读和幻读等并发问题。 4. **持久性**:一旦事务提交,其结果将永久保存,即使系统出现故障也能恢复。 为了实现事务的隔离...