(注:本文摘自http://terje.blog.163.com/blog/static/11924371200952910206453/,仅用于自己学习,若转载请注明出处)
脏读dirty reads:当事务读取还未被提交的数据时,就会发生这种事件。举例来说:Transaction 1 修改了一行数据,然后 Transaction 2 在 Transaction 1 还未提交修改操作之前读取了被修改的行。如果 Transaction 1 回滚了修改操作,那么 Transaction 2 读取的数据就可以看作是从未存在过的。
不可重复的读non-repeatable reads:当事务两次读取同一行数据,但每次得到的数据都不一样时,就会发生这种事件。举例来说:Transaction 1 读取一行数据,然后 Transaction 2 修改或删除该行并提交修改操作。当 Transaction 1 试图重新读取该行时,它就会得到不同的数据值(如果该行被更新)或发现该行不再存在(如果该行被删除)。
虚读phantom read:如果符合搜索条件的一行数据在后面的读取操作中出现,但该行数据却不属于最初的数据,就会发生这种事件。举例来说:Transaction 1 读取满足某种搜索条件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索条件的一个新行。如果 Transaction 1 重新执行产生原来那些行的查询,就会得到不同的行。
数据库带来的并发问题包括:
1.丢失或覆盖更新。(幻像读)
2.未确认的相关性(脏读)。
3.不一致的分析(非重复读)。
详细描述如下:
一.丢失更新
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。
e.g.事务A和事务B同时修改某行的值,
1.事务A将数值改为1并提交
2.事务B将数值改为2并提交。
这时数据的值为2,事务A所做的更新将会丢失。
解决办法:对行加锁,只允许并发一个更新事务。
二.未确认的相关性(脏读)
当第二个事务选择其它事务正在更新的行时,会发生未确认的相关性问题。第二个事务正在读取的数据还没有确认并且可能由更新此行的事务所更改。
e.g.
1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务) 2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000
像这样,Mary记取的工资数8000是一个脏数据。
解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可 以避免该问题。
三.不一致的分析(非重复读)
当第二个事务多次访问同一行而且每次读取不同的数据时,会发生不一致的分析问题。不一致的分析与未确认的相关性类似,因为其它事务也是正在更改第二个事务正在读取的数据。然而,在不一致的分析中,第二个事务读取的数据是由已进行了更改的事务提交的。而且,不一致的分析涉及多次(两次或更多)读取同一行,而且每次信息都由其它事务更改;因而该行被非重复读取。
在一个事务中前后两次读取的结果并不致,导致了不可重复读。
e.g.
1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。
四.幻像读
当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。
e.g. 目前工资为1000的员工有10人。
1.事务1,读取所有工资为1000的员工。
2.这时事务2向employee表插入了一条员工记录,工资也为1000
3.事务1再次读取所有工资为1000的员工 共读取到了11条记录,
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题
分享到:
相关推荐
在事务并发处理中,存在三种类型的问题:脏读、不可重复读和虚读。 脏读(Dirty Read)是指事务读取了另一个事务未提交的数据。如果第一个事务回滚了修改操作,那么第二个事务读取的数据就可以看作是从未存在过的。...
Serializable 隔离级别可以避免脏读、不可重复读、虚读和第二类丢失更新等问题,但是它的代价是性能开销较高。 二、Repeatable Read 隔离级别 Repeatable Read 隔离级别是第二高级别的隔离级别,它可以避免脏读和...
- REPEATABLE READ(可重复读):在同一个事务中多次读取相同数据会得到相同结果,防止脏读和不可重复读,但在某些情况下仍可能出现幻读。 - SERIALIZABLE(串行化):最高的隔离级别,如同操作顺序执行,防止所有...
- **未提交读**:允许脏读、不可重复读、虚读。 - **已提交读**:避免脏读,但可能出现不可重复读和虚读。 - **可重复读**:避免脏读和不可重复读,但可能有虚读。 - **串行化**:完全避免上述所有问题,但性能最低...
数据库事务隔离级别是用来管理多个事务之间相互影响的程度,主要解决的问题包括脏读、不可重复读、幻读等。 #### 二、事务隔离级别的定义与作用 事务隔离级别是指数据库系统为每个事务提供的一种环境,以确保事务在...
脏读、幻读、虚读及不可重复读 - **脏读(Dirty Read)**:一个事务读取到了另一个未提交事务的数据。 - **不可重复读(Non-repeatable Read)**: - **幻读(Phantom Read)**:在事务两次查询期间,其他事务...
它主要解决了并发操作中可能出现的数据不一致性和并发问题,如更新丢失、脏读、不可重复读和虚读。以下是四种标准的事务隔离级别及其特点: 1. 未授权读取(Read Uncommitted): 这是最低的隔离级别,允许脏读取...
2. READ_COMMITTED:读已提交,阻止脏读,发生不可重复读和虚读。 3. REPEATABLE_READ:重复读,阻止脏读、不可重复读,发生虚读。 4. SERIALIZABLE:串行处理,不允许两个事务同时操作一个目标数据,根本不存在并发...
隔离问题:脏读:一个事务读到另一个事务没有提交的数据不可重复读:一个事务读到另一个事务已提交的数据(update)虚读(幻读):一个事务读到另一个事务已提交的数据(insert)4.隔离级别:readuncommitted:读未...
不可重复读 与 虚读 的区别: 不可重复读,强调的是,第二次返回的结果中,某个条目被修改过,比如某些字段被修改 虚读,强调的是,第二次返回结果中,属于第一次返回结果的条目没有任何变化,但是返回条目...
* 未提交读(Read Uncommitted):脏读、不可重复读和虚读都有可能发生。 * 已提交读(Read Committed):避免脏读。但是不可重复读和虚读有可能发生。 * 可重复读(Repeatable Read):避免脏读和不可重复读。但是...
为了防止这些事务问题的发生,数据库系统提供了不同的事务隔离级别,包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)以及串行化(Serializable)。每种隔离级别都有其...
- 读未提交(Read Uncommitted):最低隔离级别,可能发生脏读、不可重复读和幻读。 - 读已提交(Read Committed):解决脏读问题。 - 可重复读(Repeatable Read):解决脏读和不可重复读问题。 - 串行化...
7. 脏读、幻读和不可重复读 脏读是指某个事务已更新一份数据,另一个事务在此时读取了同一份数据, 由于某些原因,前一个 RollBack 了操作,则后一个事务所读取的数据就会是不正确的。不可重复读是指在一个事务的两...
9. 数据库的并发操作若不控制,可能带来的问题包括丢失更新、读脏数据、不可重复读等。 10. 数据库系统优于文件系统的主要特点是数据是结构化的。 11. 关系模式进行投影运算后,元组个数小于或等于投影前关系的...
不同的隔离级别有不同的并发问题,如脏读、不可重复读和虚读(幻读)。 六、常用的中间件: 1. Redis:内存数据存储,提供高速缓存和持久化功能,支持多种数据结构,常用于分布式缓存。 2. Zookeeper:分布式协调...
- 事务隔离级别是数据库管理系统提供的功能,用于保证并发操作的正确性,防止诸如更新丢失、脏读、不可重读(包括虚读和幻读)等问题。SQL规范定义了四个事务隔离级别:读未提交、读已提交、可重复读和串行化。 - ...
DB2以事务为单位进行并发控制,避免了诸如丢失更新、脏读、不可重复读和虚读等并发操作可能引发的问题。例如,在飞机订票系统的例子中,通过并发控制机制可以防止在高并发情况下出现机票余额计算错误。 **封锁**是...
在事务隔离级别中,存在四种常见级别,防止脏读、不可重复读和虚读(幻读)等现象。脏读允许读取未提交的数据,不可重复读则可能导致同一行数据在事务内多次读取时出现变化,而虚读(幻读)是指在同一事务内看到其他...