文章出处:孙卫琴老师-精通Hibernate
在并发的环境之中,一个数据库系统会同时为各种各样的客户端提供服务,对于同时运行的多个事务,当这些事务访问数据库中相同的数据时如果没有采取必要的隔离机制,就会出现各种并发问题,可以把这些问题归纳为一下五种:
假设现在一所银行有一个取款事务和一个支票转账事务操作同一个银行账户的情形,首先我们假设两个事务顺序执行,而不是并发执行,那麽整个的步骤如下:
---- 银行客户在银行前台请求取款100元,出纳员先查询账户信息,得知存款余额为1000元。
---- 出纳员判断存款余额大于取款额,支付给客户100元,并将账户上的存款余额改为900元。
---- 出纳员处理一张转账支票,该支票向此账户汇入100元,出纳员先查询账户信息,得知存款余额为900元。
---- 出纳员将存款余额改为1000元。
可以很清楚的看到,如果顺序的执行这两个事务,不会出现任何问题,可是现实之中并非如此简单,如果两个事务分别由两个出纳员同时执行那麽可能就会出现并发的问题,下面我们分别来介绍:
1.第一类丢失更新
时 间 取款事务 转账事务
--------------------------------------------------------------------------------------------
T1 开始事务
T2 开始事务
T3 查询账户余额为1000元
T4 查询账户余额为1000元
T5 汇入100元把余额改为1100元
T6 提交事务
T7 取出100元把余额改为900元
T8 撤销事务余额恢复为1000元
----------------------------------------------------------------------------------------------
如果按照以上的时间次序并发执行的话,由于支票转账事务对存款余额所做的更新被取款事务的撤销所覆盖,所以客户会损失100元。
2.脏 读
时 间 取款事务 转账事务
----------------------------------------------------------------------------------------------
T1 开始事务
T2 开始事务
T3 查询账户余额为1000元
T4
T5 取出100元把余额改为900元
T6 查询账户余额为900元(脏读)
T7 撤销事务余额恢复为1000元
T8 汇入100元把余额改为1000元
T9 提交事务
----------------------------------------------------------------------------------------------
由于支票转账事务查询了取款事务未提交的更新数据,并且在这个查询结果的基础上进行了更新操作,如果取款事务最后被撤销 ,会导致银行客户损失100元。
3.虚 读
下面我们另举一个例子来看看什么是虚读。
时 间 注册事务 统计事务
----------------------------------------------------------------------------------------------
T1 开始事务
T2 开始事务
T3 统计注册客户总数为10000人
T4 注册一个新用户
T5 提交事务
T6 统计注册客户总数为10001人
T7 到底哪一个统计数据有效?
-----------------------------------------------------------------------------------------------
统计事务无法相信查询的结果,因为查询结果是不确定的,随时可能被其他事务改变。
对于实际应用,在一个事务中不会对相同的数据查询两次,假定统计事务在T3时刻统计注册客户的总数,执行SELECT语句,在T6时刻不再查询数据库,而
是直接打印统计结果为10000,这个统计结果与数据库当中数据是有所出入的,确切的说,它反映的是T3时刻的数据状态,而不是当前的数据状态。应该根据
实际需要来决定是否允许虚读。以上面的统计事务为例,如果仅仅想大致了解一下注册客户总数,那麽可以允许虚读;如果在一个事务中,会依据查询结果来做出精
确的决策,那麽就必须采取必要的事务隔离措施,避免虚读。
4.不可重复读
时 间 取款事务 转账事务
----------------------------------------------------------------------------------------------
T1 开始事务
T2 开始事务
T3 查询账户余额为1000元
T4 查询账户余额为1000元
T5 取出100元把余额改为900元
T6 提交事务
T7 查询账户余额为900元
T8 余额到底是1000元还是900元?
-----------------------------------------------------------------------------------------------
如上面所示,如果支票转账事务两次查询账户的存款余额,但得到了不同的查询结果,这使得银行出纳员无法相信查询结果,因为查询结果是不确定的,随时可能被其他事务改变。
5.第二类丢失更新
时 间 取款事务 转账事务
----------------------------------------------------------------------------------------------
T1 开始事务
T2 开始事务
T3 查询账户余额为1000元
T4 查询账户余额为1000元
T5 取出100元把余额改为900元
T6 提交事务
T7
T8 汇入100元把余额改为1100元
T9 提交事务
----------------------------------------------------------------------------------------------
每个事务都不知道其他事务的存在,最后一个事务对记录所做的更新将覆盖由其他事务对记录所做的已提交的更新。上面的例子里由于支票转账事务覆盖了取款事务对存款余额所做的更新,导致银行最后损失了100元
分享到:
相关推荐
事务并发带来的坏处,以及通过设置事务隔离级别来处理
### 数据库事务并发与事务加锁 #### 一、数据库事务基本概念 在数据库领域,事务(Transaction)是由一系列操作组成的逻辑工作单元。事务具备四个关键特性:原子性(Atomicity)、一致性(Consistency)、隔离性...
数据库思维导图——并发控制 并发控制 多事务执行方式 (1)事务串行执行 每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行 不能充分利用系统资源,发挥数据库共享资源的...事务并发执行带来的问题
本文将深入探讨并发事务带来的三种主要问题:脏读、不可重复读和幻读,以及MySQL如何通过事务隔离级别来解决这些问题。 首先,脏读(Dirty Reads)指的是一个事务读取到了另一个未提交事务的数据,导致数据的不一致...
不同的隔离级别会带来不同的并发问题,如脏读、不可重复读和幻读。 1. 脏读:一个事务读取到了另一个事务还未提交的数据。 2. 不可重复读:在一个事务内,多次读取同一数据,结果不同,因为其他事务已经修改并提交...
本篇文章将深入探讨MySQL中的事务并发问题及其解决方案,包括悲观锁和乐观锁的应用。 首先,问题背景是在视频观看记录更新场景中,当用户观看进度达到100%时,后续请求不再更新。然而,由于并发事务处理不当,出现...
另一种是多版本并发控制(MVCC),允许多个事务同时读取同一数据的不同版本,减少锁定带来的阻塞。此外,还有两阶段锁协议(2PL)、乐观并发控制(OCC)和并发事务调度算法如死锁检测与解除策略。 在恢复技术方面,...
当我们讨论“事务并发现象”时,通常是在指并发控制中的问题,这些问题可能出现在多用户同时访问数据库的情况下。今天我们将深入探讨Java中事务管理以及其相关的隔离级别。 首先,事务有四个基本特性,也称为ACID...
当多个事务并发运行时,如果没有适当的控制,可能会导致数据不一致、死锁等问题。以下是关于并发控制的一些关键知识点: 1. **为什么需要并发控制**:在数据库系统中,多个用户可能同时访问和修改同一数据,这可能...
本章节主要讨论数据库系统中的并发控制技术,旨在解决多用户数据库系统中并发事务执行带来的问题。数据库管理系统必须提供并发控制机制,以确保事务的隔离性和数据库的一致性。 11.1 并发控制概述 并发控制是...
通过合理应用这两种类型的锁,可以在不影响并发性能的前提下,有效防止并发操作所带来的问题。 ### 活锁与死锁 #### 活锁 活锁发生在多个事务请求相同的资源时,由于某些事务总是让位于其他事务,导致某些事务...
事务并发可能导致多种问题,包括: - **更新丢失**:两个事务同时修改同一数据,后提交的事务覆盖了前者的修改。 - **不可重复读**:同一事务内多次读取同一数据,由于其他事务的修改,导致读取结果不一致。 - **脏...
总的来说,处理 Informix 并发问题的关键在于理解数据库的并发控制机制,合理利用事务、锁和游标等工具,同时考虑系统的整体性能和用户体验。通过实例分析和实践,我们可以不断优化并发处理策略,以适应高并发的核心...
#### 三、事务并发带来的问题 事务并发执行可能导致以下几种问题: 1. **丢失更新**: - 描述:两个或多个事务对同一数据进行修改时,导致其中一些事务的更新被其他事务覆盖。 - 示例:在两个并发的事务中,一个...
为了应对上述问题,数据库系统通常采用各种并发控制机制来保证数据的一致性和事务的隔离性。常见的并发控制方法包括: 1. **封锁**:通过加锁机制来防止多个事务同时访问同一数据项。封锁分为排他锁(X锁)和共享锁...
这意味着即使在有拜占庭错误存在的条件下,系统也能够保证事务处理的顺序性,从而避免了并发操作可能带来的冲突。 文章介绍了拜占庭容错的历史背景以及其在提高分布式应用可靠性的潜力。过去十年,拜占庭容错算法在...
在高并发环境中,系统往往面临着连接超时和资源超卖的问题,特别是在电商秒杀或抢购场景中,数据库和缓存系统的压力巨大。本示例针对这些问题,利用Redis的乐观锁机制来提供解决方案。Redis是一种高性能的键值存储...
然而,多事务的执行也会带来一些问题,如读取和存储不正确的数据,破坏事务的隔离性和数据库的一致性。因此,DBMS 必须提供并发控制机制,来确保事务之间的一致性和隔离性。 并发控制机制的任务是对并发操作进行...