数据库并发事务存在的三个问题(脏读、不可重复读、幻读)

如果不考虑事务隔离性,可能会发生以下情况

脏读:事务a,读到了事务b未提交的数据,如果事务a读到了事务b的一些中间数据,待处理的数据。b事务数据还没有提交,就被a事务访问了

(解决方法:将 读未提交 级别提高到 读已提交 例如:orale在事务a 更新t表的时候,表t为锁住的状态,事务a未提交之前,事务b就不能访问t表)

不可重复读:指的是事务两次读取数据不一样。因为中间被其他事务修改了。解决方法就是 将 级别提高到 可重复。使用行级锁,锁定当前记录,其它事务无法更改。针对update操作

幻读:一个事务在查询,另一个事务在做插入或者删除,此时就会出现幻读。导致表的总行数不一致的情况

事务的干扰级别:读未提交、读已提交、可重复读、串行化。

参考博客:

https://blog.csdn.net/fanzhigang0/article/details/93198059

原文地址:https://www.cnblogs.com/jkwll/p/12149661.html

时间: 2024-10-13 04:53:58

数据库并发事务存在的三个问题(脏读、不可重复读、幻读)的相关文章

mysql事务隔离级别/脏读/不可重复读/幻读详解

一.四种事务隔离级别 1.1 read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔离级别,标准实在太宽松了. 1.2 read committed 读已提交(简称RC) 即:事务A只能读取到事务B修改并已提交的数据. 这个级别相对要严格一些,至少是要等其它事务把变更提交到db,才能读取到,听上去蛮靠谱的.但是有些业务场景,比如会员系统中,如果要在一个事务中,多次读取用户身份,判

数据库并发导致的脏读 不可重复读 幻读的处理方法

在做ERP订单接入仓库库存的时候出现了一个问题.下单会读取该商品是否有库存.如果有那么就下单 减去(可下单库存,物理库存不变) 没有则提示库存不足 在并发情况下就会导致 u1用户下单编号为1的商品1个  u2用户也下单编号为1的商品1个.编号为1的商品库存只有1个. 那么当u1在读取出数据的时候发现库存有一个 但是还没有写入库存的操作   u2也下单成功并提交  那么就会导致数据错乱 本来应该是只有u1会下单成功u2则提示库存不足 这里可以用事物的隔离机制或乐观锁来解决 事物是一个逻辑单元 原子

[MySQL]对于事务并发处理带来的问题,脏读、不可重复读、幻读的理解与数据库事务隔离级别 - 分析脏读 & 不可重复读 & 幻读

刚开始写博客.. 写的太low. 1.数据库的两种读,每种读读的数据版本不一样,所以也称为MVCC,即多版本并发控制 a) 快照读 select * from where xxx  这种形式的都是快照读. b) 当前读 update , insert ,delete ,select xx from xx for update ,  in share mode 都是当前读 当前读会等待,不会返回数据的历史版本 2.mvcc 的实现原理 mvcc是基于read view.活跃事务列表 做的,以后的文

理解数据库事务隔离级别以及脏读, 不可重复读, 幻读(转)

  转自:http://blog.csdn.net/sunxing007/article/details/6427290 数据库事务的4个特性: 原子性(atomic): 都成功或者都失败: 一致性(consistency):事务操作之后,数据库所处的状态和业务规则是一致的;比如a,b账户相互转账之后,总金额不变: 隔离性(isolation):操作中的事务不相互影响; 持久性(durability):事务提交后被持久化到数据库. 脏读,不可重复读, 幻读 幻读phantom read:事务1读

数据库事务隔离级别 - 分析脏读 & 不可重复读 & 幻读

一 数据库事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted .Read committed .Repeatable read .Serializable ,这四个级别可以逐个解决脏读 .不可重复读 .幻读这几类问题. 1. Read UnCommitted(读未提交) 最低的隔离级别.一个事务可以读取另一个事务并未提交的更新结果. 2. Read Committed(读提交) 大部分数据库采用的默认隔离级别.一个事务的更新操作结果只有在该事务提交之后,另

商品分类-商品详情-数据库脏读-不可重复读-幻读-订单生成

商品详情的无限极分类 --北京 --朝阳区 ---上海 --松江 --大学城 def get_level(data): data_list=[] for item in data: if item['parent_id']==0: item['level']=0 else: item['level']=1 data_list.append(item) return data_list data=[ {"cat_id":1,"name":"北京",

了解数据库中脏读+不可重复读+幻影读

"读现象"是多个事务并发执行时,在读取数据方面可能碰到的状况.先了解它们有助于理解各隔离级别的含义.其中包括脏读.不可重复读和幻读. 脏读: 脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的. 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交(commit)到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据.因为这个数据是还没有提交

数据库并发事务控制四:postgresql数据库的锁机制二:表锁

在博文<数据库并发事务控制四:postgresql数据库的锁机制 > http://blog.csdn.net/beiigang/article/details/43302947 中后面提到: 常规锁机制可以参考pg的官方手册,章节和内容见下面 13.3. Explicit Locking http://www.postgresql.org/docs/9.4/static/explicit-locking.html 这节分为:表锁.行锁.页锁.死锁.Advisory锁(这个名字怎么翻译好???

数据库并发事务控制 一:综述

并发控制是DBMS的关键技术 对数据库的操作都是在事务中进行的. 事务是指一组相互依赖的操作行为.事务中的操作是不可分割的工作单元,由一组在业务逻辑上相互依赖的SQL语句组成,有ACID特征. Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败. Consistency(一致性):只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初状态. Isolation(隔离性):事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完