【mysql】MySQL 事务的四大特性以及实现原理

1.  事务的四大特性

        mysql的四大特性是指事务的ACID特性。

1.1  A 原子性 表示事务是作为一个整体被执行的,要么全部执行,要么全部不执行

1.2  C 一致性 是指事务开始前和结束后,数据不会被破坏。比如A向B转账100元,A的余额减少100,B的余额增加100,A和B整体的总金额是不变的

1.3  I 隔离性 表示多个事务并发执行,事务直接是相互隔离,一个事务的运行不影响其他事务的运行结果

1.4  D 持久性 表示事务执行成功后,该事务对数据库的数据操作更改,都要持久化保存到数据库种

2.  事务的实现原理

        而mysql事务的实现原理,就是InnoDB是如何保证ACID特性的。 

2.1 原子性:原子性就是一个事务如果包含多个DML操作,要么全部成功,要么全部失败。

如果事务在执行过程中失败了就需要回滚原本执行成功的数据。所以InnoDB设计了一个undo_log表,事务在执行过程中,会将修改的数据快照保存到undo_log,一旦出现错误,直接从undo_log里读取数据并执行反向操作就行了。

2.2 一致性:一致性表示数据的完整性约束没有被破坏,这个更多的是通过业务层面来保证。数据库也提供了一些,比如主键的唯一约束/字段的长度限制/字段类型的限制等。

2.3 隔离性: 隔离性就是多个并行事务对同一个数据进行操作,如果避免多个事务的干扰而导致数据混乱的问题。

InnoDB实现了SQL92的标准,提供了四种隔离级别的实现,分别是读未提交/读已提交/可重复读/串行化。InnoDB默认的隔离级别是可重复读,然后使用mvcc解决脏读和不可重复读的问题,使用行锁/表锁解决幻读的问题。

2.4 持久性:持久性就是事务只要执行成功,修改的数据都要持久化到磁盘,不能因为宕机或者其他原因导致数据变更失效。

理论上来说,事务执行成功后直接把数据持久化到磁盘就行了,但是由于磁盘的io效率比较低,InnoDB设计了Buffer Pool来优化,数据在发生变更时,先更新内存缓冲区,然后在合适的时机持久化到磁盘。

但是如果在持久化的过程中,突然宕机,就会导致数据丢失,也就无法保证持久性了。

所以InnoDB又引入了redo_log日志,当数据变更的时候,除了修改内存缓冲区里的数据之外,还会把本次修改的值追加到redo_log。当事务提交的时候,直接把redo_log日志刷新到磁盘进行持久化,一旦数据库出现宕机,mysql重启后可以直接用redo_log里面保存的重写日志,再重新执行一遍保证持久性。

所以,事务实现的原理的本质就是保证ACID的特性,InnoDB里面通过MVCC/行锁表锁/undo_log/redo_log等机制来保证的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值