数据库带来的并发问题包括:
1.丢失或覆盖更新。(幻像读)
2.未确认的相关性(脏读)。
3.不一致的分析(非重复读)。<?xml:namespace prefix = o ?>
详细描述如下:
一.丢失更新
当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。
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条记录,
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题
分享到:
相关推荐
例如,在Java程序中可以使用Spring框架提供的声明式事务管理来控制事务的行为,从而避免脏读、不可重复读和幻读等问题的发生。 1. **基于元数据的Spring声明式事务**: - Spring框架提供了`@Transactional`注解,...
并发控制的主要目标是避免事务之间的冲突,防止出现诸如脏读、不可重复读和幻读等问题。 脏读发生在事务T1读取了事务T2还未提交的修改数据,然后T2因为某种原因回滚了更改。在这种情况下,T1读到的数据实际上是错误...
1. 读未提交(Read Uncommitted):允许读取未提交的数据,可能导致脏读、不可重复读、幻读。 2. 读提交(Read Committed):仅能读取已提交的数据,避免脏读,但仍可能遇到不可重复读和幻读。 3. 可重复读...
数据库的脏读、不可重复读、幻读都和事务的隔离性有关。所以先了解一下事务的4大特性。 事务的4大特性(ACID): 1、原子性(Atomicity):事务是数据库的逻辑工作单位,它对数据库的修改要么全部执行,要么...
该资源详细介绍了MySQL数据库中的事务隔离级别,包括读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable),并讨论了这些级别如何影响脏读、不可重复读...
- 可重复读(Repeatable Read):确保一个事务中多次读取同一数据时,其结果是一致的,防止了脏读和不可重复读,但是幻读仍可能发生。 - 可串行化(Serializable):最高的隔离级别,它通过强制事务串行执行,避免了...
READ UNCOMMITTED允许脏读,READ COMMITTED防止脏读但可能出现不可重复读,REPEATABLE READ解决不可重复读问题,但可能有幻读,而SERIALIZABLE是最严格的隔离级别,能防止所有并发问题,但可能会导致较高的锁定开销...
尤其是当多个事务并发执行时,可能会遇到一系列的问题,其中就包括脏读、不可重复读和幻读。理解这些问题并知道如何避免它们对于编写健壮的数据库应用程序至关重要。 首先,让我们定义一下这三种问题的含义: 1. ...
MySQL的可重复读(Repeatable Read)隔离级别是其事务管理机制的一部分,旨在解决数据库并发操作中的一些问题,如脏读、不可重复读和幻读。然而,标题中提出的问题在于,可重复读隔离级别是否能完全防止幻读。在这个...
当我们谈论“不可重复读”时,这是事务隔离级别中的一个概念,涉及到并发控制和多用户访问数据库时可能出现的问题。在这个主题中,我们将深入探讨不可重复读的现象、原因以及如何避免它。 不可重复读(Non-...
在这种级别下,每次查询都会获取当前的数据库状态,所以可以防止脏读,但不能防止不可重复读和幻读。Oracle 数据库默认采用的就是这个隔离级别。在 MySQL 中,如果我们把两个连接的事务隔离级别都设置为提交读,那么...
- **序列化(SERIALIZABLE)**:最严格的隔离级别,通过锁定事务期间的所有读取行,防止脏读、不可重复读和幻读,但可能降低并发性能。 2. **数据库锁**:用于在多用户环境中控制对数据的并发访问。 - **行锁**:...
- 串行化(Serializable):最严格的隔离级别,通过锁定所有涉及的行,确保事务按顺序执行,避免脏读、不可重复读和幻读,但可能造成较高的并发性能损失。 在MySQL中,可以通过设置事务隔离级别或使用特定的查询...
文档中讨论的核心概念是“不可重复读”,它是一种在并发控制中常见的现象,也是数据库管理系统需要解决的一个问题。 首先,我们需要了解什么是“不可重复读”现象。在一个事务中,当它多次执行相同的查询操作时,...
8. **并发控制的重要性**:并发控制避免了脏读、不可重复读和幻读等问题,保证了事务的正确执行和数据库的一致性。 9. **PowerDesigner使用**:PowerDesigner是一款强大的数据库建模工具,绘制实体、属性和联系的...
数据库并发控制的主要目标是解决在多事务环境下可能出现的四个主要问题:脏读(Dirty Read)、不可重复读(Non-repeatable Read)、幻读(Phantom Read)以及丢失更新(Lost Update)。这些问题都是由于事务间的交互...
4. 串行化(Serializable):这是最高的隔离级别,通过锁定事务涉及的所有数据,完全避免了脏读、不可重复读和幻读。然而,这也可能导致较高的并发性能损失,因为事务需要等待其他事务完成。 数据库管理系统如...
- **读未提交(Read Uncommitted)**:最低的隔离级别,允许事务读取未提交的数据,可能会出现脏读、不可重复读和幻读。 - **读已提交(Read Committed)**:只能读取已经提交的数据,可以避免脏读,但仍然可能出现...
- **读未提交(read-uncommitted)**:允许脏读和不可重复读、幻读。 - **读已提交(read-committed)**:禁止脏读,但可能发生不可重复读和幻读。 - **可重复读(repeatable-read)**:MySQL默认隔离级别,禁止...