1.1 事务的特性
总体来说,事务存在四大特性,分别是原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),如图1-1所示,因此,事务的四大特性又被称为ACID。
图1-1 事务的四大特性
1.1.1 原子性
事务的原子性指的是构成事务的所有操作要么全部执行成功,要么全部执行失败,不可能出现部分执行成功,部分执行失败的情况。
例如,在转账业务中,张三向李四转账100元,于是张三的账户余额减少100元,李四的账户余额增加100元。在开启事务的情况下,这两个操作要么全部执行成功,要么全部执行失败,不可能出现只将张三的账户余额减少100元的操作,也不可能出现只将李四的账户余额增加100元的操作。
1.1.2 一致性
事务的一致性指的是在事务执行之前和执行之后,数据始终处于一致的状态。例如,同样是转账业务,张三向李四转账100元,且转账前和转账后的数据是正确的,那么,转账后张三的账户余额会减少100元,李四的账户余额会增加100元,这就是数据处于一致的状态。如果张三的账户余额减少了100元,而李四的账户余额没有增加100元,这就是数据处于不一致状态。
1.1.3 隔离性
事务的隔离性指的是并发执行的两个事务之间互不干扰。也就是说,一个事务在执行过程中不能看到其他事务运行过程的中间状态。例如,在张三向李四转账的业务场景中,存在两个并发执行的事务A和事务B,事务A执行扣减张三账户余额的操作和增加李四账户余额的操作,事务B执行查询张三账户余额的操作。在事务A完成之前,事务B读取的张三的账户余额仍然为扣减之前的账户余额,不会读取到扣减后的账户余额。
注意
MySQL通过锁和MVCC机制来保证事务的隔离性。
1.1.4 持久性
事务的持久性指的是事务提交完成后,此事务对数据的更改操作会被持久化到数据库中,并且不会被回滚。例如,在张三向李四转账的业务场景中,在同一事务中执行扣减张三账户余额和增加李四账户余额的操作,事务提交完成后,这种对数据的修改操作就会被持久化到数据库中,且不会被回滚。
注意
数据库的事务在实现时,会将一次事务中包含的所有操作全部封装成一个不可分割的执行单元,这个单元中的所有操作要么全部执行成功,要么全部执行失败。只要其中任意一个操作执行失败,整个事务就会执行回滚操作。