在Spring Boot中,当我们使用了spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 依赖的时候,框架会自动默认分别注入DataSourceTransactionManager 或 JpaTransactionManager。所以我们不需要任何额外配置就可以用@Transactional注解进行事务的使用。
SpringBoot 事务的使用Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。 关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager ,如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。
(1)声明式事务1、你可以在启动类中添加如下方法,run 启动类,就能知道自动注入的是 PlatformTransactionManager 接口的哪个实现类。
@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的
@SpringBootApplication
public class SbtwebdemoApplication {
@Bean
public Object testBean(PlatformTransactionManager platformTransactionManager){
System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
return new Object();
}
public static void main(String[] args) {
SpringApplication.run(SbtwebdemoApplication.class, args);
}
}
2、这些 SpringBoot 为我们自动做了,这些对我们并不透明,如果你项目做的比较大,添加的持久化依赖比较多,我们还是会选择人为的指定使用哪个事务管理器。 代码如下:
@EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的
@SpringBootApplication
public class SbtwebdemoApplication {
// 其中 dataSource 框架会自动为我们注入
@Bean
public PlatformTransactionManager txManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public Object testBean(PlatformTransactionManager platformTransactionManager){
System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName());
return new Object();
}
public static void main(String[] args) {
SpringApplication.run(SbtwebdemoApplication.class, args);
}
}
在Spring容器中,我们手工注解 @Bean 将被优先加载,框架不会重新实例化其他的 PlatformTransactionManager 实现类。
3、在Service中,被 @Transactional 注解的方法,将支持事务。如果注解在类上,则整个类的所有方法都默认支持事务。
(2)编程式事务
Spring 做了封装,我们使用可 TransactionTemplate 的编程式事务。
编程式事务:通过编写代码来管理事务,事务的控制力度更细,不存在传播属性的特性。
编程式事务不存在传播属性的说法,它的传播属性就只有一个,即:
- TransactionDefinition.PROPAGATION_REQUIRED默认值:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。这是最常见的选择。
每个编程式事务都是独立的,并且使用完毕之后,就会释放。
TransactionTemplate 的 execute() 方法有一个 TransactionCallback 类型的参数,该接口中定义了一个 doInTransaction() 方法,通常我们以匿名内部类的方式实现 TransactionCallback 接口,并在其 doInTransaction() 方法中书写业务逻辑代码。
在其doInTransaction() 方法中使用默认的事务提交和回滚规则:
- 如果在执行回调方法的过程中抛出了未检查异常,或者显式调用了TransacationStatus.setRollbackOnly() 方法,则回滚事务;
- 如果事务执行完成或者抛出了 checked 类型的异常,则提交事务。
TransactionCallback 接口有一个子接口 TransactionCallbackWithoutResult,该接口中定义了一个 doInTransactionWithoutResult() 方法,
- TransactionCallbackWithoutResult 接口主要用于事务过程中不需要返回值的情况。
1、代码如下:
@Autowired
private TransactionTemplate transactionTemplate;
@Override
public OperateResult doTransactionTemplate() {
OperateResult operateResult = new OperateResult();
operateResult.setSuccess(true);
User user = new User();
user.setUserName("赵云");
user.setPazzword("zhy123");
user.setSex("男");
user.setAge(20);
user.setBirthday(new Date());
transactionTemplate.execute(new TransactionCallback() {
@Override
public OperateResult doInTransaction(TransactionStatus transactionStatus) {
int count = userMapper.insert(user);
if (count
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?