博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot 事务的使用
阅读量:3925 次
发布时间:2019-05-23

本文共 4565 字,大约阅读时间需要 15 分钟。

       在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配置方式的 
@SpringBootApplicationpublic 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配置方式的 
@SpringBootApplicationpublic 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 <= 0) { operateResult.setSuccess(false); return operateResult; } Role role = new Role(); role.setRoleName("超管"); role.setCode("admin"); count = roleMapper.insert(role); if (count <= 0) { // 回滚事务 transactionStatus.setRollbackOnly(); operateResult.setSuccess(false); return operateResult; } UserRole userRole = new UserRole(); userRole.setUserId(user.getId()); userRole.setRoleId(role.getId()); count = userRoleMapper.insert(userRole); count = 1 / 0; if (count <= 0) { // 回滚事务 transactionStatus.setRollbackOnly(); operateResult.setSuccess(false); return operateResult; } operateResult.setData(user); return operateResult; } }); return operateResult; }

2、源码分析

查看 TransactionTemplate类中 execute方法。

 

SpringBoot 事务的使用非常简单,对于同一个工程中存在多个事务管理器要怎么处理,全局性事务控制如何在springboot中配置等等 还有待学习。

参考文章(挺不错的):

     

 

ends ~

 

 

转载地址:http://pjcgn.baihongyu.com/

你可能感兴趣的文章
Java跨平台的构思分析
查看>>
linux目录结构名称对照
查看>>
Java的优化机制对代码编写的启示
查看>>
java与并发
查看>>
设计的理念
查看>>
设计的理性模型
查看>>
多线程专题 - 定时器Timer
查看>>
多线程专题 - 单例模式和多线程
查看>>
多线程专题 - 拾遗增补
查看>>
多线程专题 - 脉络图
查看>>
javascript 函数,BOM
查看>>
javascript 客户端能力检测
查看>>
javascript DOM详解之DOM1
查看>>
javascript DOM扩展
查看>>
矛盾论读书笔记
查看>>
规则 - 利用CDN缓存
查看>>
规则 - 灵活管理缓存
查看>>
规则 - 利用Ajax缓存
查看>>
规则 - 利用页面缓存
查看>>
规则 - 利用应用缓存
查看>>