脏读,不可重复读和幻读

脏读是指在数据库访问中,一个事务在修改数据但尚未提交之前,另一个事务读取了这些未提交的数据。如果第一个事务因为某种原因被回滚,那么第二个事务读取的数据就是无效的,这种情况被称为脏读。脏读一般发生在更新操作中,当一个事务T1修改了某个值,事务T2读取了这个值,但T1在提交前撤销了对该值的修改,导致T2读取到的数据是无效的。‌

脏读的问题在于它可能导致事务读取到未提交的数据,这些数据最终可能不会被存入数据库中,因此事务读取到的数据可能是不存在的。这种情况可能导致严重的后果,因为事务A可能基于这些无效数据做出了错误的决策或操作。‌

为了避免脏读问题,可以采取的措施包括:在第一个事务提交前,任何其他事务不可读取其修改过的值,或者使用更严格的隔离级别来确保数据的一致性和可靠性。例如,通过设置数据库的事务隔离级别为“读已提交”或“可重复读”,可以有效地防止脏读的发生

不可重复读是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。‌

不可重复读的原因是在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。‌

不可重复读的解决方法有:

幻读问题通常强调在某一个范围内的数据行变多或变少,导致数据集的不一致性。幻读不仅限于两次读取结果集的不同,更侧重于某次查询结果所表征的数据状态无法支撑后续的业务操作,例如,在准备插入一条记录前查询该记录不存在,但在实际插入时却发现记录已存在。‌23

如何解决幻读问题

解决幻读问题的方法主要包括以下几种:

  • 选择适当的隔离级别,如可重复读或串行化,来防止不可重复读。‌
  • 使用‌行级锁或‌多版本并发控制等方法。‌
  • 幻读(Phantom Read)是指当事务不是独立执行时发生的一种现象。具体来说,幻读发生在以下情况:

  • 事务A读取与搜索条件相匹配的若干行。
  • 事务B以插入或删除行等方式来修改事务A的结果集,并提交这些修改。
  • 随后,事务A再次执行相同的查询时,会发现结果集中出现了之前不存在的行(或某些行被删除),就好像发生了幻觉一样。‌
  • 增加范围锁(RangeS):锁定检索范围为只读,避免其他事务插入新行或删除行,从而防止幻读。
  • 使用更高的隔离级别
  • SERIALIZABLE_READ:这是数据库定义的最高隔离级别,可以保证不出现幻读问题。
  • Repeatable Read (RR):在RR隔离级别下,针对当前读,RR会保证对读取到的记录加锁(记录锁),同时保证对读取的范围加锁(间隙锁),新的满足查询条件的记录不能插入,从而避免幻读。
  • MVCC(多版本并发控制)与LBCC(基于锁的并发控制)
  • 在RR隔离级别中,InnoDB通过MVCC机制生成事务版本,并规定访问规则,以解决幻读问题。但在存在当前读的情况下,MVCC可能仍会出现幻读,此时可以使用LBCC,即基于锁的机制(如行锁、表锁、间隙锁等)来解决。‌
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值