文章目录
# 事务管理
事务简介
事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。
• 事务的特性(ACID)
- 原子性(Atomicity):事务是应用中不可再分的最小执行体
- 一致性(Consistency):事务执行的结果,须使数据从一个一致性状态,变为另一个一致性状态。
- 隔离性(Isolation):各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的。
- 持久性(Durability):事务一旦提交,对数据所做的任何改变都要记录到永久存储器中。
事务的隔离性
常见的并发异常
- 第一类丢失更新、第二类丢失更新。
- 脏读、不可重复读、幻读
常见的隔离级别 隔离级别从低到高
- Read Uncommitted:读取未提交的数据。
- Read Committed:读取已提交的数据。
- Repeatable Read:可重复读。
- -Serializable:串行化。
第一类丢失更新
比如事务2在T4时刻提交数据把N修改为9,然而在T6时刻事务1发生了回滚,把N的值修改为10;
事务1的回滚导致了事务2已经更新的数据丢失。
第二类丢失更新
比如事务2在T4时刻提交数据把N修改为9,然而在T6时刻事务1提交了事务,把N的值修改为11;
事务1的提交导致了事务2已经更新的数据丢失。
脏读
事务2在T3时刻读取到了事务1在T2时刻修改过的数据,此时N=11,然后事务1在T4时刻进行了回滚,修改N的值为10;
事务2读取到了事务1为提交的数据
不可重复读
事务2在T2时刻读取N为10,T4时刻事务1提交事务修改N为11,事务2在T5时刻再次读取N,此时值为11,两次读取的结果不一致;
幻读
事务2在T1时刻查询到3条数据,事务1在T3时刻提交事务导致食物2在T4时刻查询到4条数据,两次查询到的行数不一样
事务隔离级别
–级别从低到高
–性能从高到低
事务的传播机制
解决两个事务交叉在一起的时候以谁的事务为准的问题
–REQUIRED :支持当前事务(外部事务),比如A事务调用B事务,B事务以A事务的事务为标准,如果A不存在事务则创建一个新的事务;
–REQUIRED_NEW :创建一个新事务,按照B事务的标准执行,不管A是否有事务,如果有事务暂定当前事务(外部事务)即A事务;
–NESTED:如果当前存在事务(外部事务),则嵌套在该事务中执行,即如果A有事务,B事务有独立的提交和回滚,如果A没有事务则创建一个新的事务,和REQUIRED一样。
Spring事务管理
• 声明式事务 (常用注解)
- 通过XML配置,声明某方法的事务特征。
- 通过注解,声明某方法的事务特征。
在方法上添加注解,isolation设置隔离级别;propagation设置传播机制
@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
• 编程式事务 (方法步骤较多,对中间特定步骤添加事务管理的时候常用)
- 通过 TransactionTemplate 管理事务,
并通过它执行数据库的操作
1、注入TransactionTemplate
2、设置隔离级别和传播机制
3、调用execute方法,传入回调接口
4、使用匿名内部类,实现 doInTransaction 方法里写业务逻辑
@Autowired
private TransactionTemplate transactionTemplate;
public Object save2() {
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
return transactionTemplate.execute(new TransactionCallback<Object>() {
@Override
public Object doInTransaction(TransactionStatus status) {
}
});
}