MySQL的事务的基本特性和隔离级别、MySQL事务的ACID靠什么保障

事务基本特性

原子性
原子性很好理解,就是指一个事务的操作要么全部成功,要么全部失败
一致性
举例来说,例如A转账100到B中,这个操作是需要从A的账户中减去100,B的账户中增加100。这个操作中如果如果A账户余额不足100了没有通过约束,次事务就不能成功。为了保证数据一致性,将会使用到原子性,让减少和增加这两个事务都失败。可以这样大概的理解,事务的原子性、隔离性、持久性就是用来保证一致性的
隔离性
隔离性是指一个事务这修改提交前,对其他事务的可见程度,根据事务隔离级别来进行分别
持久性
持久性就是指,事务一旦提交了,所修改的内容将可以保存到数据库中

事务隔离级别

read uncommit 读未提交
这个级别下的事务,是可以读到没有提交的数据的,也就是脏读。已下图为例,因为第二个事务是后出现的,也就是可以读取到事务一暂无提交的数据。最终因为事务一失败了,由于事务二可以读未提交,并且事务二成功了导致B账户中多了100。所以使用此隔离级别需要慎重选择
在这里插入图片描述

read commit 读已提交
读已提交也叫做不可重复读,这个隔离级别解决了读脏数据的问题,只会读取已提交的事务。但是会出现两次读的数据不一致的情况。已下图为例,如果事务三再事务二还没有提交前去读数据,那么事务三读到的也就是事务一的提交数据。随后事务二提交了,然后事务三再次读取时,就会读取事务二提交的数据。这个事务隔离级别是oracle的默认级别
在这里插入图片描述
repeatable read 可重复读
可重复读是指每次读到的数据都会是一样的,会以第一次读到的提交事务为准。已下图为例,事务三在进行第一次读时,事务二还没有提交,此时事务三读到的则是事务一提交的数据。这第二次读的时候事务二已经提交了,但是事务三会不做理会,而是继续去读事务一中的内容,每次读取都是同样的结果。但是在新增(insert)数据时会出现幻读,例如这进行范围查询例如大于小于,比如说第一次查询是3条数据,这执行insert之后第二次会出现4条数据,可以使用间隙锁来解决。可重复读是mysql的默认事务级别
在这里插入图片描述
serializable 串行
串行一般不会被使用,串行会给每一行读的数据加上锁,会导致大量的超时和锁的竞争可应用场景不多

ACID的保障

A原子性由undo log保证,这个日子记录了要回滚的日志信息,事务回滚时撤销已经执行成功的SQL
C一致性需要由其它三大特性保证与程序业务代码保证一致性,比如说余额90转账100这个肯定是不成立,这个肯定是不能通过的,所以需要业务代码中处理
I 隔离性由MVCC来保证,也就是事务列表(trx_sys->trx_list)创建一个副本(read view),具体要根据隔离基本判定
D持久性由内存+redo log来保证,mysql修改数据同时这内存中和redo log记录这次操作,如果mysql宕机了可以从redo log恢复,redo log的操作会在系统空闲时进行。下图是innoDB中redo log写盘简易过程
在这里插入图片描述

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acmen-zym

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值