Mysql的事务处理

Mysql的事务特性(ACID)?

原子性

原子性是指事务内一组操作要么全部执行成功,要么全部失败。

原子性的实现原理靠的是undo log,当事务对数据库进行修改时,InnoDB会生成对应的undo log;如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

一致性

一致性是指在事务处理的ACID属性中,一致性是最基础的属性,其它的三个属性都为了保证一致性而存在的。

持久性

持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。

持久性的实现原理靠的是redo log。

隔离性

隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

innodb实现的RR,通过锁机制(包含next-key lock)、MVCC(包括数据的隐藏列、基于undo log的版本链、ReadView)等,实现了一定程度的隔离性。

主要可以分为几个方面:

一个事务读-一个事务读:这种不会相互干扰,所以不用考虑。

一个事务读-一个事务写:使用MVCC来保持隔离性。

一个事务写-一个事务写:使用锁机制来保持隔离性。

事务并发情况下,读操作可能存在的三类问题:

脏读:当前事务(A)中可以读到其他事务(B)未提交的数据(脏数据),这种现象是脏读。

不可重复读:在事务A中先后两次读取同一个数据,两次读取的结果不一样,这种现象称为不可重复读。脏读与不可重复读的区别在于:前者读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据。

幻读:在事务A中按照某个条件先后两次查询数据库,两次查询结果的条数不同,这种现象称为幻读。不可重复读与幻读的区别可以通俗的理解为:前者是数据变了,后者是数据的行数变了。

事务隔离级别(如下图):


锁机制

首先来看两个事务的写操作之间的相互影响。隔离性要求同一时刻只能有一个事务对数据进行写操作,InnoDB通过锁机制来保证这一点(参考内部文章Mysql的锁)。

事务在修改数据之前,需要先获得相应的锁;获得锁之后,事务便可以修改数据;该事务操作期间,这部分数据是锁定的,其他事务如果需要修改数据,需要等待当前事务提交或回滚后释放锁。

MVCC

mvcc可以解决脏读,不可重复读,幻读问题(参考内部文章MVCC多版本并发控制)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容