概述MySQL事务隔离级别类型

MySQL中锁的类型

表锁

      顾名思义,也就是每次对一张表进行操作的时候会锁住整张表,这样加锁的速度更快,但是加锁的粒度太大,发生锁冲突的概率回很高,所以表锁的并发效率不高

如何给表加锁以及差查那些表已经被上锁:

lock table 表名称 read(write),表名称2 read(write)--加锁
unlock tables; --解锁
show open tables; --查看被加锁的表

表锁的特性:

  • 如果加的是读锁,那么会阻塞其他事务的更新、插入操作,但是不会阻塞读取
  • 如果加的是写锁,无论什么操作都是会阻塞,直到另一个事务解锁,才会执行后面的事务语句
     很重要的一点是 MyISAM存储引擎 在执行查询语句的时候会自动给涉及到的表加读锁,增删改操作会给表加写锁。

行锁

    行锁就是锁住表中某一行数据,相比于表锁他的开销大,效率也稍微弱一点,但是锁的粒度小,相对的并发度也很高

InnoDB和MyISAM存储引擎最大的区别就是:InnoDB支持行锁和事务,这两点MyISAM是没有的。

行锁事务属性

  1. 原子性(Atomicity)
    也就是在一个事务中的一组SQL语句要一起执行完或者都失败,它们是一个整体,强调动作
  2. 一致性(Consistent)
    在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的,强调动作之后的结果
  3. 隔离性(Isolation)
    数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的。简单说每个事务都是不能被其他事务影响。
  4. 持久性(Durable)
    事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持

 

那么在并发场景下会出现那些事务问题

  1. 更新丢失
    在两个事务A、B读取数据库的时候,都读取到初始值,A事务先更新,B事务后更新,这时候B事务就会将A事务更新的结果覆盖掉
  2. 脏读
    同样是两个事务,A事务在对数据做更新的时候并未提交数据,这时候B事务读取到了A未提交的数据,这种情况下一旦事务A回滚事务,那么B事务的数据就变成了脏数据。
  3. 不可重读
    A事务在读取数据后的某个时间,重新读取了这条数据,但是这条数据已经被其他数据修改了,但是这时候A事务还没结束,这就不符合事务的隔离性,这就是不可重读的问题,简单说就是读取到了其他事务已经提交的更新操作
  4. 幻读
    一个事务使用一条查询语句重新查询时发现两次的结果不一致,因为其他事务在这个条件中插入了数据, 也就是说事务A读取到了事务B提交的新增数据,同样也是不符合隔离性

 

MySQL的事务隔离级别

事务隔离级别脏读不可重读幻读
读未提交(read-uncommitted)可能可能可能
读已提交(read-committed)不可能可能可能
可重读(repeatable-read)不可能不可能可能
串行化(serializable)不可能不可能不可能

 

    表中横排是可能出现的事务问题,竖排是MySQL存在是隔离级别,因为对于重读的问题,最大只能支持到已提交的更新,也就是说:可重读的事务隔离级别下是不会出现读取到其他事务中已经提交更新的数据。因为幻读是一个特殊的情况 他是已提交的插入操作,只有串行化才能解决,但是一旦用了串行话MySQ的性能就相对没有可重读那样高。综合考虑一般情况下都是使用可重读的事务隔离级别

查看当前数据库的事务隔离级别: show variables like 'tx_isolation';
设置事务隔离级别:set tx_isolation='REPEATABLE-READ';

可重复读的验证

1、开启事务START TRANSACTION,并查询当前表中数据

  1. 打开另一个客户端开启事务,更新表并提交:
update account set balance = balance - 50 where id = 2

   客户端B已经查询到更新后的数据是:850

 

这时客户端B的数据已经更新,但是客户端A再次查询是没有查询到更新后的数据

那么这时候在客户端A操作更新语句会是什么情况?是850吗?

update account set balance = balance - 50 where id = 2

按照实际操作来看,在更新的时候没有变成900-50 = 850,而是读取到了事务B已经提交的结果。这样数据一致性的机制没有被破坏。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值