一、事务初识
1. 什么是事务
事务就是一组独立不可分割的工作单元,事务中的操作要么全部执行,要么都不执行。
- 事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,一组不可再分割的操作集合(工作逻辑单元)。
- 简单来说,事务就是并发控制的单位,是用户定义的一个操作序列。
- 在关系型数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
- MySQL中,MyISAM引擎没有实现事务,而InnoDB实现了事务,这也是MyISAM 逐渐被InnoDB 所替代的原因之一。
2. 为什么要有事务
如果之前没有了解过事务,看了上面事务的介绍的小伙伴,想必还是不理解事务到底是什么东东吧。那么接下来就从经典的转账操作案例来分析什么是事务以及为什么要使用事务。
- 假设你的朋友手头紧向你借1000元,你本着多年的友情毫不犹豫地给你朋友转了1000元,上述的过程可以拆分为以下三个步骤(假设A为我,B为你的朋友):
- 1)A发起转账1000给B
- 2)A账户余额减少1000
- 3)B账户余额增加1000
- 如果没有使用事务,每一步正常执行,那没什么问题。但是如果1,2步骤成功,第3步骤由于网络或其余故障导致执行失败,那么就会发生A账户钱减少了,但是B账户钱并没有增加,那么此时你的朋友就会说没有收到哇,你此时也会有疑问,甚至恼火抱怨银行怎么这么不靠谱,平白无故损失1000元。
- 所以这时候事务闪亮登场,将2,3步骤整合到一个事务中,这样即使2成功,3失败,由于事务的同甘共苦(一起成功,一起失败)特性,2的操作也会回滚。最终也不会有任何的损失。
二、事务的四大特性
提到事务首先想到的当然是事务的四个特性:原子性、一致性、隔离性、持久性,即所谓的ACID。
1. A(Atomicity) 原子性
原子性指的是事务是不可分割的工作单位,只有事务中的所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL执行失败,已经执行成功的SQL语句也必须撤销,回滚到执行事务的之前的状态。例如上述的转账操作,2,3步骤必须全部执行成功才算事务成功,否则一旦其中某一个操作执行失败,整个事务必须全部回滚到之前的状态。
2. C(Consistency) 一致性
一致性是指事务将数据库从一种一致性状态变为下一种一致性状态。在事务开始之前和之后,数据库的完整性约束没有被破坏。例如上述转账的例子,无论转账的成功与否,A和B加起来的总额不会变化,不多也不少。
3. I(Isolation) 隔离性
**隔离性要求每个读写事务对其他事务的操作对象能相互分离。**例如事务T1和事务T2的操作不能相互干扰。
4. D(Durability) 持久性
一个事务成功完成后,它对数据库的改变必须是永久的,即使事务刚提交机器就宕机了数据也不能丢。事务终结的标志即内存的数据持久到硬盘文件中。