Spring中分为编程式事务和声明式事务,其中编程式事务最常用
编程式事务处理:
定义:通过业务层中注入事务管理器对象,然后通过编码的方式进行事务控制
缺点:
1.代码冗余
2.不够通用
3.不便于维护
声明式事务处理:
定义:通过利用aop切面编程进行事务控制 ,并对事务属性在配置文件中完成细粒度配置,这种方式称为声明式事务
好处:减少代码冗余 更加专注于业务逻辑开发,无需重复编码
一、编程式事务
1.之前在Mybatis框架中的事务控制:
SqlSession 提交 :sqlsession.commit 回滚: sqlsesssion.rollback
mybatis是对JDBC的封装 =======>connection 对象 java.sql.Connection commit() 或 rollback()
所以说,项目中真正的负责数据库事务控制的对象:Connection对象
2.用来实现事务控制的核心对象是
Connection 连接对象的 commit() rollback()
3.那么我们如何在项目中获取Connection对象???
在现有项目中有DruidDataSource(连接池) 池子里都是 Connection 连接
Connection conn = DruidDataSource( ).getConnection();
4.
4.1.1给现有的业务层添加事务之前我们都是这样写:
这样写会导致业务层(Service)拿到的数据库连接和DAO层拿到的数据库连接不一样,导致线程不安全
4.1.2 针对上面的问题,在spring和mybatis框架中提供了一个类
DataSourceTransactionManager 数据源事务管理类(不生产数据源,依赖于数据源,管理数据源)
作用:在全局创建一个事务管理器,用来统一调度 业务层当前线程使用的连接对象和DAO层实现连接对象一致 (类似于TheadLocal)
DataSourceTransactionManager ,这个类在创建的时候需要依赖于数据源,所有日后我们用这个类,就能保证业务层(Service)拿到的数据库连接和DAO层拿到的数据库连接一致。
所以我们将代码修改如下:
二、声明式事务
上面这种尽管比编程式事务要方便,但是还是有冗余
所以,Spring框架给我们提供了标签
这里要注意,事务细粒度配置:
三、事务注解式开发
<tx:annotation-driven></tx:annotation-driven>,使用这个标签,我们可以省略了上面我们在配置文件中写的配置
使用这个标签后,我们可以@Transactional注解,来控制事务,之前在配置文件中的细粒度操作,在注解中也都可以实现。
控制事务的注解
@Transactional (一般加在业务层)
作用:用来给类中的方法加入事务控制 简化了配置文件 简化了两段配置:1.事务通知及事务细粒度配置 2.简化事务切面配置
修饰范围:类和方法上 局部优先原则
- 加在类上 代表类中所有方法加入事务控制
- 加在方法上 代表当前方法加入事务控制
- 类和方法上同时存在,方法优先
使用要求:如果想要让@Transactional 这个注解生效,需要在配置文件中配置” 开启注解式事务生效”
注解细粒度属性:
事务传播属性: