数据库事务隔离级别(脏读、幻读、不可重复读)

一、脏读、幻读和不可重复读

一、脏读、不可重复读、幻读

1、脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
例如:
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。
与此同时,
事务B正在读取张三的工资,读取到张三的工资为8000。
随后,
事务A发生异常,而回滚了事务。张三的工资又回滚为5000。
最后,
事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。

2、不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
例如:
在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。
与此同时,
事务B把张三的工资改为8000,并提交了事务。
随后,
在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。

3、幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
例如:
目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
此时,
事务B插入一条工资也为5000的记录。
这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。

4、提醒 
不可重复读的重点是修改: 
同样的条件,你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增或者删除: 
同样的条件,第 1 次和第 2 次读出来的记录数不一样

5、第一类丢失更新

A事务撤销时,把已经提交的B事务的更新数据覆盖了。例如: 
这里写图片描述
这时候取款事务A撤销事务,余额恢复为1000,这就丢失了更新。

6、第二类丢失更新

A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失 
这里写图片描述

 

二、如何解决

为了解决上述问题,数据库通过锁机制解决并发访问的问题。根据锁定对象不同:分为行级锁和表级锁;根据并发事务锁定的关系上看:分为共享锁定和独占锁定,共享锁定会防止独占锁定但允许其他的共享锁定。而独占锁定既防止共享锁定也防止其他独占锁定。为了更改数据,数据库必须在进行更改的行上施加行独占锁定,insert、update、delete和selsct for update语句都会隐式采用必要的行锁定。

但是直接使用锁机制管理是很复杂的,基于锁机制,数据库给用户提供了不同的事务隔离级别,只要设置了事务隔离级别,数据库就会分析事务中的sql语句然后自动选择合适的锁。 
不同的隔离级别对并发问题的解决情况如图: 
这里写图片描述

注意:事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低。

 

 

  • 146
    点赞
  • 728
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
幻读脏读不可重复读数据库中常见的并发控制问题。 1. 幻读(Phantom Read):幻读是在同一个事务中,多次执行同一个查询语句,但结果集却不同的现象。通常是由于并发事务中的插入、更新或删除操作导致的。例如,一个事务在查询时得到了某个范围内的数据行,并且在此事务提交之前,其他事务插入了一个新的符合该查询条件的数据行,那么在此事务再次查询时,会返回多出来的这条新数据行,这就是幻读。 2. 脏读(Dirty Read):脏读是指一个事务读取了另一个事务未提交的数据。当一个事务读取到另一个未提交事务的数据后,如果未提交事务回滚或修改了该数据,那么读取到的数据就是脏数据。脏读可能导致错误的判断和处理。 3. 不可重复读(Non-repeatable Read):不可重复读是指在同一个事务中,多次执行同一个查询语句,但结果集却不一致的现象。通常是由于并发事务中的更新或删除操作导致的。例如,一个事务在查询时得到了某个数据行,并且在此事务提交之前,其他事务修改或删除了该数据行,那么在此事务再次查询时,会得到与之前不同的结果,这就是不可重复读。 为了解决这些问题,可以采用以下并发控制方法: - 锁机制:通过给数据对象加锁来控制并发访问。 - 事务隔离级别:通过设置事务隔离级别来控制不同事务之间的可见性。 - MVCC(Multi-Version Concurrency Control):通过为每个事务创建一个独立的数据版本来避免并发冲突。 - 乐观并发控制:通过版本号或时间戳等方式来检测并发冲突,减少锁的使用。 这些方法可以根据具体情况选择并结合使用,以确保数据库的一致性和并发性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值