经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
spring boot基于注解的声明式事务配置详解
来源:jb51  时间:2021/8/9 13:56:43  对本文有异议

事务配置

1、配置方式一

1)开启spring事务管理,在spring boot启动类添加注解@EnableTransactionManagement(proxyTargetClass = true);等同于xml配置方式的 <tx:annotation-driven />(注意:1项目中只需配置一次,2需要配置proxyTargetClass = true)

2)在项目中需要添加事务的类或方法上添加注解@Transactional(建议添加在方法上),一般使用默认属性即可,若要使用事务各属性可查看spring事务官方文档了解

2、配置方式二(指定事务,需要多个事务管理器时用)

1)开启事务管理:创建多个事务,如下例子

  1. @Configuration
  2. @EnableTransactionManagement(proxyTargetClass = true)
  3. public class TransactionConfig implements TransactionManagementConfigurer{
  4. @Value("${spring.datasource.driver-class-name}")
  5. private String driverClassName;
  6. @Value("${spring.datasource.druid.url}")
  7. private String url;
  8. @Value("${spring.datasource.druid.username}")
  9. private String username;
  10. @Value("${spring.datasource.druid.password}")
  11. private String password;
  12. @Bean
  13. public DataSource dataSourceDb() {
  14. DruidDataSource dataSource = new DruidDataSource();
  15. dataSource.setDriverClassName(driverClassName);
  16. dataSource.setUrl(url);
  17. dataSource.setUsername(username);
  18. dataSource.setPassword(password);
  19. return dataSource;
  20. }
  21. /**
  22. * 【作用】事务管理器<br>
  23. * 【说明】(无)
  24. * @param
  25. * @author Kalvin
  26. * @Date 2017/12/19 10:39
  27. */
  28. @Bean
  29. public PlatformTransactionManager transactionManager() {
  30. return new DataSourceTransactionManager(dataSourceDb());
  31. }
  32. // 创建事务管理器2
  33. @Bean(name = "txManager2")
  34. public PlatformTransactionManager txManager2(EntityManagerFactory factory) {
  35. return new JpaTransactionManager(factory);
  36. }
  37. /**
  38. * 【作用】如果没有指定事务,默认返回当前事务管理<br>
  39. * 【说明】(无)
  40. * @param
  41. * @author kkyc
  42. * @Date 2017/12/19 10:03
  43. */
  44. @Override
  45. public PlatformTransactionManager annotationDrivenTransactionManager() {
  46. return transactionManager();
  47. }
  48. }

到这里已经成功整合好事务配置了,你只需要在使用的地方添加注解@Transactional即可,如果需要限定事务管理器,可使用@Transactional(“txManager2”)

spring boot事务(注解模式)

使用注解模式不需要配置文件,也不需要配置事务配置类或者方法,只需要使用“@Transcation”注解引入到相对应的位置即可实现事务回滚功能。

1.引入pom.xml

  1. <!-- 事物 -->
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-tx</artifactId>
  5. </dependency>

2.在controller里面使用事务注解

因为service和接口层都是直接操作数据库的方法,一般需要多个操作或者循环的Controller才需要事务支持,如果是mybatis批量操作数据库语句也不需要事务

事务作用域一般常见的分成两种:

①定义在类上面 :所有的方法都支持事务

②定义在方法上 :只有该方法支持事务

  1. package com.Transaction.controller;
  2. import java.util.List;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.transaction.annotation.Transactional;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. import com.Transaction.entity.Alarmtype;
  9. import com.Transaction.mapper.AlarmtypeMapper;
  10. import com.Transaction.service.AlarmtypeService;
  11. @Controller
  12. //@Transactional //事务级别,如果该类中同时操作多个方法,只要失败则全部回滚
  13. public class AlarmtypeController {
  14. @Autowired
  15. AlarmtypeMapper alarmtypeMapper;
  16. @Autowired
  17. AlarmtypeService alarmtypeService;
  18. @RequestMapping("index")
  19. public synchronized String index(){
  20. //List<Alarmtype> list = alarmtypeMapper.getAlarmtypeList();
  21. List<Alarmtype> list = alarmtypeService.findAll();
  22. for (int i = 0; i < list.size(); i++) {
  23. System.out.println(list.get(i).getId()+"--"+list.get(i).getAlarmname());
  24. }
  25. return "index";
  26. }
  27. //批量插入
  28. @RequestMapping("addBatch")
  29. @ResponseBody
  30. @Transactional//对整个方法进行事务处理,方法体内只要有一个方法没执行成功则全部回滚
  31. public synchronized int addBatch(){
  32. Alarmtype alarmtype = new Alarmtype();
  33. Alarmtype updatealarmtype = new Alarmtype();
  34. updatealarmtype.setId(1);
  35. updatealarmtype.setAlarmname("修改前轮故障");
  36. alarmtypeMapper.updateAlarmtypeById(updatealarmtype);
  37. int result = 0;
  38. try {
  39. for (int i = 0; i < 5; i++) {
  40. if(i==2){
  41. //alarmname在数据库中长度不超过50,赋值超过50报异常 Data too long
  42. alarmtype.setAlarmname("测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试");
  43. alarmtype.setAlarmtypeid(i);
  44. }else{
  45. alarmtype.setAlarmname("测试"+i);
  46. alarmtype.setAlarmtypeid(i);
  47. }
  48. result = alarmtypeMapper.addAlarmtype(alarmtype);
  49. }
  50. }catch (Exception e) {
  51. e.printStackTrace();
  52. }
  53. return result;
  54. }
  55. @RequestMapping("test")
  56. @ResponseBody
  57. public synchronized String test(){
  58. return "test";
  59. }
  60. }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号