事务管理和Spring事务管理简介

文章目录



# 事务管理

事务简介

事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。

• 事务的特性(ACID)

  • 原子性(Atomicity):事务是应用中不可再分的最小执行体
  • 一致性(Consistency):事务执行的结果,须使数据从一个一致性状态,变为另一个一致性状态。
  • 隔离性(Isolation):各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的。
  • 持久性(Durability):事务一旦提交,对数据所做的任何改变都要记录到永久存储器中。

事务的隔离性

常见的并发异常

  • 第一类丢失更新、第二类丢失更新。
  • 脏读、不可重复读、幻读

常见的隔离级别 隔离级别从低到高

  • Read Uncommitted:读取未提交的数据。
  • Read Committed:读取已提交的数据。
  • Repeatable Read:可重复读。
  • -Serializable:串行化。

第一类丢失更新

比如事务2在T4时刻提交数据把N修改为9,然而在T6时刻事务1发生了回滚,把N的值修改为10;

事务1的回滚导致了事务2已经更新的数据丢失。

事务管理和Spring事务管理简介

第二类丢失更新

比如事务2在T4时刻提交数据把N修改为9,然而在T6时刻事务1提交了事务,把N的值修改为11;

事务1的提交导致了事务2已经更新的数据丢失。

事务管理和Spring事务管理简介

脏读

事务2在T3时刻读取到了事务1在T2时刻修改过的数据,此时N=11,然后事务1在T4时刻进行了回滚,修改N的值为10;

事务2读取到了事务1为提交的数据

事务管理和Spring事务管理简介

不可重复读

事务2在T2时刻读取N为10,T4时刻事务1提交事务修改N为11,事务2在T5时刻再次读取N,此时值为11,两次读取的结果不一致;

事务管理和Spring事务管理简介

幻读

事务2在T1时刻查询到3条数据,事务1在T3时刻提交事务导致食物2在T4时刻查询到4条数据,两次查询到的行数不一样

事务管理和Spring事务管理简介

事务隔离级别

–级别从低到高

–性能从高到低

事务管理和Spring事务管理简介

事务管理和Spring事务管理简介

事务的传播机制

解决两个事务交叉在一起的时候以谁的事务为准的问题

–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) {

        }
    });
}
上一篇:机器学习-线性回归


下一篇:Spring(一)