事务
1 事务定义
事务是一个操作序列。这个操作序列要么全部执行,要么都没有执行。
2 事务的四个特性
事务的四个特性:原子性、一致性、隔离性、持久性
- 原子性(Atomicity):事务即原子操作,要么全部执行成功,要么都未执行
- 一致性(Consistency):事务执行前后产生的影响的是一致,即不会产生数据不一致的状态
- 隔离性(Isolation):多个事务并发执行互不影响
- 持久性(Durability):事务提交成功后,所产生的效果是持久的,即使服务崩溃,依旧可以恢复
严格保证隔离性可能会对系统性能产生较大的不利影响,一般都会对隔离性做出一些妥协;
3 事务的五种状态
事务处于的五种状态包含
- 活动的(Active):初始状态,事务执行时处于该状态;
- 部分提交的(Partially committed):事务最后一条语句执行后,事务提交前事务处于的状态;
- 失败的(Failed):事务执行过程中出现异常,无法继续执行;
- 中止的(Aborted):事务执行过程中因出现异常,导致无法执行,需要回滚已执行的操作,将系统恢复到事务执行前的状态;
- 已提交的(Committed):事务执行完成后,提交事务后处于的状态
图3.1 事务状态流转
1. 对于一些发送短信、邮件等可见的操作,因为用户可能已经看见,是无法执行回滚操作的,需要开发人员保证事务提交后再执行这些操作;
2. 事务回滚一般通过事务执行的逆向操作来完成,即可以理解为一个补偿事务,这个补偿事务执行的操作是事务的逆向操作;
4 事务的四种隔离级别
- 未提交读(Uncommitted Read):一个事务允许读取其他事务还未提交的更改,会产生脏读
- 已提交读(Committed Read):一个事务只允许读取其他事务已提交的更改,不会产生脏读,但不可重复读
- 可重复读(Repeated Read):一个事务只允许读取其他事务已提交的更改,并且一个事务两次读取一个数据期间,其他事务不能更新该数据。不会产生脏读,可重复读,但因为只限制其他事务不可更改该事务读取的数据,其他事务还可以新插入数据,所以会产生幻读;
- 串行化(Serialize):事务是一个一个串行执行的;
一般应用程序都会为了提高系统性能,选择较弱的事务隔离级别,可能中间会出现数据不一致的情况,但是只要保证数据最终一致性也是能接受的。
5 实现事务隔离性的方案
- 锁
- 两阶段封锁协议:第一个阶段只能拿取锁,不能释放锁;第二个阶段只是释放锁,不能拿取锁;
- 共享锁和排他锁
- 时间戳
- 版本管理