事务隔离级别

事务隔离级别

数据事务隔离级别有四种,由底到高分别为 Read uncommited 、Read commited 、 Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读

  1. Read uncommitted

    顾名思义 ,就是一个事务可以读取另一个未提交事务的数据。

    事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是工资时老板不小心按错了数字,将6按成了9 ,该钱已经打到程序员的户头,但是事务并没有提交, 与此同时,程序员登上了自己的银行账户发现工资多了三千,喜出望外,这时,老板发现了自己的错误,马上回滚了即将要提交的事务,修正后进行提交。

    分析:当程序猿看到了老板未经提交的数据, 这就发生了脏读,怎么解决呢 使用 read commited

  2. Read commited

    顾名思义,就是一个事务要等另一个事务提交后才能读取

    事例:程序员拿着工资卡(卡里有3.6万),当他买单时(程序员事务启动),收费系统开始收费流程,并检查了他的余额有3.6万,就在这个时候!!! 程序员的妻子突然将钱全部转走并提交,当收费系统扣款时,发现没钱了(第二次检查金额当然要等待妻子转出金额事务提交完成事务提交完)。

    分析:这就是读提交,若有事务对数据进行更新操作时,读操作事务要等待这个更新提交后才能读取数据,可以解决脏读问题, 但在这个事例中,出现了一个事务范围两次相同的查询却返回了不同数据,这就是不可重复读。怎么解决不可重复的读呢?使用 repeatable read

    1. Repeatable read 【mysql 默认】

    重复读,就是在开始读取数据时,不再允许修改操作

    事例:程序员拿着工资卡去享受生活(还是3.6万),当他买单时(事务开启,不允许其他事务的update 修改操作) , 收费系统事先检查到他卡里有3.6万,这个时候他的妻子就不能转出金额了,扣费系统也能顺利扣款了。

    分析:重复读可以解决不可重复读的问题。写到这里,应该明白的一点是,不可重复的对应的是修改,即update操作。但是可能还会有幻读的问题,因为幻读问题对应的是插入insert操作,而不是update操作。

  3. 什么是幻读呢?

    事例:程序员某一天去消费,花了两千块,当妻子检查他的消费记录(妻子事务开启) 进行全表查询,看到了程序员的消费两千,就在这个时候,程序员花了一万买了一个电脑,在记录表中插入一条消费记录,并提交,当妻子打印消费记录时,发现花了1.2万这和原先的查询结果不一样,这就是幻读。

    怎么解决幻读问题呢?

  4. Serializable 序列化

    Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离等级效率低下,比较耗费数据库性能,一般不使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值