文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

spring boot基于注解声明式事务配置的示例分析

2023-06-20 20:22

关注

小编给大家分享一下spring boot基于注解声明式事务配置的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

事务配置

1、配置方式一

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

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

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

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

@Configuration@EnableTransactionManagement(proxyTargetClass = true)public class TransactionConfig implements TransactionManagementConfigurer{    @Value("${spring.datasource.driver-class-name}")    private String driverClassName;    @Value("${spring.datasource.druid.url}")    private String url;    @Value("${spring.datasource.druid.username}")    private String username;    @Value("${spring.datasource.druid.password}")    private String password;    @Bean    public DataSource dataSourceDb() {        DruidDataSource dataSource = new DruidDataSource();        dataSource.setDriverClassName(driverClassName);        dataSource.setUrl(url);        dataSource.setUsername(username);        dataSource.setPassword(password);        return dataSource;    }        @Bean    public PlatformTransactionManager transactionManager() {        return new DataSourceTransactionManager(dataSourceDb());    }    // 创建事务管理器2    @Bean(name = "txManager2")    public PlatformTransactionManager txManager2(EntityManagerFactory factory) {        return new JpaTransactionManager(factory);    }        @Override    public PlatformTransactionManager annotationDrivenTransactionManager() {        return transactionManager();    }}

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

spring boot事务(注解模式)

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

1.引入pom.xml

  <!-- 事物 -->  <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-tx</artifactId>     </dependency>

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

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

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

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

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

package com.Transaction.controller;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.transaction.annotation.Transactional;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.Transaction.entity.Alarmtype;import com.Transaction.mapper.AlarmtypeMapper;import com.Transaction.service.AlarmtypeService;@Controller//@Transactional //事务级别,如果该类中同时操作多个方法,只要失败则全部回滚public class AlarmtypeController { @Autowired AlarmtypeMapper alarmtypeMapper;  @Autowired AlarmtypeService alarmtypeService;  @RequestMapping("index") public synchronized String index(){  //List<Alarmtype> list = alarmtypeMapper.getAlarmtypeList();  List<Alarmtype> list = alarmtypeService.findAll();  for (int i = 0; i < list.size(); i++) {   System.out.println(list.get(i).getId()+"--"+list.get(i).getAlarmname());  }  return "index"; }  //批量插入 @RequestMapping("addBatch") @ResponseBody @Transactional//对整个方法进行事务处理,方法体内只要有一个方法没执行成功则全部回滚 public synchronized int addBatch(){  Alarmtype alarmtype = new Alarmtype();  Alarmtype updatealarmtype = new Alarmtype();  updatealarmtype.setId(1);  updatealarmtype.setAlarmname("修改前轮故障");  alarmtypeMapper.updateAlarmtypeById(updatealarmtype);  int result = 0;  try {   for (int i = 0; i < 5; i++) {    if(i==2){     //alarmname在数据库中长度不超过50,赋值超过50报异常 Data too long     alarmtype.setAlarmname("测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试");     alarmtype.setAlarmtypeid(i);    }else{     alarmtype.setAlarmname("测试"+i);     alarmtype.setAlarmtypeid(i);    }    result = alarmtypeMapper.addAlarmtype(alarmtype);   }  }catch (Exception e) {   e.printStackTrace();  }  return result; }  @RequestMapping("test") @ResponseBody public synchronized String test(){    return "test"; }}

看完了这篇文章,相信你对“spring boot基于注解声明式事务配置的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯