温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-08-09 13:50:26 来源:亿速云 阅读:112 作者:小新 栏目:开发技术

小编给大家分享一下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;
    }
    /**
     * 【作用】事务管理器<br>
     * 【说明】(无)
     * @param
     * @author Kalvin
     * @Date 2017/12/19 10:39
     */
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSourceDb());
    }
    // 创建事务管理器2
    @Bean(name = "txManager2")
    public PlatformTransactionManager txManager2(EntityManagerFactory factory) {
        return new JpaTransactionManager(factory);
    }
    /**
     * 【作用】如果没有指定事务,默认返回当前事务管理<br>
     * 【说明】(无)
     * @param
     * @author kkyc
     * @Date 2017/12/19 10:03
     */
    @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基于注解声明式事务配置的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI