mysql数据库隔离级别 2020面试必看

【隔离级别】

MySQL默认的隔离级别是可重复读

在sql中定义了四种隔离级别:

READ UNCOMMITED(未提交读)事务之间的数据时相互可见的

READ COMMITED(提交读)大多数数据库的默认隔离级别,保证了不可能脏读,但是不能保证可重复读,在这个级别里,数据的加锁实现是读取都是不加锁的,但是数据的

写入,修改和删除是需要加锁的

REPEATABLE READ(可重复读)解决了不可重复读的问题,保证了在同一个事务中,多次读取相同的记录的值得结果是一致的.但是无法解决幻读。这个阶段的事务隔离性,

在mysql中是通过基于乐观锁原理的多版本控制实现的

SERIALIZABLE(可串行化读)最高的隔离级别,解决了幻读,它会在读取的每一行数据上都进行加锁,有可能导致超时和锁争用的问题;

它的加锁实现是读取的时候加共享锁,修改删除更新的时候加排他锁,读写互斥,但是并发能力差


 

【数据一致性】

事务:用于保证数据库的一致性

数据一致性:就是当多个用户试图同时访问一个数据库,它们的事务同时使用相同的数据时,可能会发生以下四种情况:丢失更新、脏读、不可重复读、幻读

【丢失更新】

当两个或者多个事务同时对某一个数据进行更新的时候。事务B的更新可能覆盖掉事务A的更新,导致更新丢失

    ··解决方法:悲观锁的方式:加锁,建议最后一步更新数据的时候加上排他锁,加锁后,首先做一下加锁的查询确认数据有没有改变,如果没有,则进行数据更新

否则失败。一定要做加锁的查询确认,否则你不加锁的话,有可能你在做确认的时候数据又发生了改变.

    ··乐观锁的方式:使用版本控制实现

【脏读】

事务可以读取未提交的数据,

比如:事务A对一个数据data=1000,进行修改:data=2000,但是还没提交;

事务B读取data,得到了结果data=2000;

事务A撤销了刚才的操作,数据data=1000,然后提交

这时事务B读取到的2000就是脏数据。正确的还应该是1000.

解决方法:把数据库的事务隔离级别调整到READ_COMMITTED

【不可重复读】

在同一个事务中,多次读取相同的记录的值得结果是不一样的,针对的是数据的修改和删除

比如:事务A 读取data=1000,事务还没完成;

事务B修改了data=2000,修改完毕事务提交;

事务A 再次读取data,发现data=2000了,与以前读取的不一致

解决方法:把数据库的事务隔离级别调整到REPEATABLE READ ,读取时不允许其他事务修改该数据,不管数据在事务过程读取多少次,数据都是一致的,避免了不可重复读

【幻读】

当某个事务在读取某个范围内的记录的时候,另一个事务在这个范围内增加了一行,当前一个事务再次读取该范围的数据的时候就会发生幻行,针对的是

数据的insert

解决方案:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读或者把数据库的隔离级别调整到SERIALIZABLE_READ,MySQL中InnoDB和XtraDB利用(多版本并发控制)

解决了幻读问题

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值