前言
前面几篇,我们分析了MySQL中索引的相关知识以及explain执行计划分析,想必大家对索引已经有了基本的认识,那么这一篇,我将为大家介绍一下MySQL中事务以及MVCC相关知识
什么是事务
事务(Transaction)是由一系列对数据库中的数据进行访问与更新的操作所组成的一个程序执行单元。
在同一个事务中所进行的操作,要么都成功,要么就什么都不做。理想中的事务必须满足四大特性,这就是大名鼎鼎的ACID。
事务的ACID特性
并不是所有的事务都满足ACID特性,比如:对于Oracle和SQLServer数据库,其默认隔离级别是ReadCOMMITTED,就不满足I(隔离性)的要求;对于MySQL的NDBCluster引擎来说,不满足D(持久性)的要求。
A(Atomicity)-原子性
原子性指的是数据库事务是不可分割的一部分,只有一个事务中的所有操作都成功,这个事务才算执行成功,一旦有一个操作失败,那么其他成功的操作也必须回滚。
以转账元场景为例,一个转账过程就是一个事务,这个事务主要包括以下两步:
1、从A账户扣除元
2、将B账户中增加元
试想,如果第一步成功了,那么第二步失败了,那就等于A的元钱直接消失了,相信这是任何人都不能接受的事项,所以数据库事务才需要保证原子性。
C(Consistent)-一致性
指的是在事务开始之前和事务结束之后,数据库的完整性约束都没有被破坏,事务执行的前后都是合法的数据状态。
比如我们有一张表中有一个字段name建立了一个唯一约束,那么当我们进行事务提交或者事务回滚之后,这个name必须依然保证唯一。
I(Isolation)-隔离性
隔离性就是说每个事务之间的操作应该相互隔离,互不干扰。比如说一个事务提交之前对另一个事务不可见。
隔离是一个相对抽象而复杂的概念,比如说事务之间的隔离性我们到底要隔离到哪种程度呢?所以,针对隔离,SQL92标准定义了4种隔离级别,这个放在后面事务的隔离级别中介绍。
D(Durable)-持久性
持久性这个概念就比较容易理解了,就是说事务一旦提交成功了,那么就应该是持久的,即使是数据库重启,服务器宕机等情况发生,数据都不会丢失(当然这个不能包括因为地震等自然灾害导致的存储数据的硬盘损发生不可逆的损坏)。
事务的管理
可能很多人会说自己都感知不到MySQL的事务,其实这是因为MySQL事务是默认开启了自动提交的,因此,如果要感知到事务,我们需要关闭自动提交或者显示开启事务。
事务的自动提交
查看自动提交语句:
执行如下语句关闭自动提交:
不过需要注意的是,这种修改方式只是在当前会话窗口生效,对其他会话窗口是不生效的,MySQL几乎所有变量设置都会分成两个级别,session(会话)和global(全局)级别,默认就是session级别。
常用的事务控制语句
STARTTRANSACTION或者BEGIN:显示的开启事务。需要注意的是在存储过程中只能用STARTTRANSACTION开启事务,因为存储过程本来有BEGIN…END语法,两者会冲突。COMMIT:提交事务。也可以写成COMMITWORK。ROLLBACK:回滚事务。也可以写成ROLLBACKWORK。SAVEPOINTidentifier:自定义保存点,适用于长事务,可以回滚到我们自定义的位置。RELEASESAVEPOINTidentifier:删除一定保存点,如果没有保存点的时候,会报错ROLLBACKTO[SAVEPOINT]identifier:回滚到指定保存点。COMMIT和COMMITWORK的区别
这两个都能提交一个事务,区别就在于提交事务之后的操作,同样的还有ROLLBACK和ROLLBACKWORK,主要是通过一个变量来控制: