首页 > 编程语言 >JAVA@Transactional常用失效场景

JAVA@Transactional常用失效场景

时间:2024-07-13 14:19:41浏览次数:10  
标签:事务 JAVA student RuntimeException Transactional result Student new 失效

    @Transactional(rollbackFor = {RuntimeException.class, Error.class})
    @Override
    public boolean create() {
        create1();
        create2();
        return true;
    }
public void create1() {
Student student = new Student();
student.setName("事务1");
//不能为空
student.setGender(1);
int result = studentMapper.insert(student);
if (result != 1) {
throw new RuntimeException("新增失败");
}
}

public void create2() {
Student student = new Student();
student.setName("事务2");
student.setGender(1);
studentMapper.insert(student);
Student student2 = new Student();
student2.setName("事务3");
int result = studentMapper.insert(student2);
if (result != 1) {
throw new RuntimeException("新增失败");
}
}
 

以上事务生效。在create()方法上添加事务,create2()因为gender为空产生报错,促使整个create()方法回滚,整体可以理解为是长事务;

 

@Override
public boolean create() {
create1();
create2();
return true;
}

@Transactional(rollbackFor = {RuntimeException.class, Error.class})
public void create1() {
Student student = new Student();
student.setName("事务1");
//不能为空
student.setGender(1);
int result = studentMapper.insert(student);
if (result != 1) {
throw new RuntimeException("新增失败");
}
}
@Transactional(rollbackFor = {RuntimeException.class, Error.class})
public void create2() {
Student student = new Student();
student.setName("事务2");
student.setGender(1);
studentMapper.insert(student);
Student student2 = new Student();
student2.setName("事务3");
int result = studentMapper.insert(student2);
if (result != 1) {
throw new RuntimeException("新增失败");
}
}


以上事务触发不生效规则——同一个类中里层方法(create1(),create2())添加@Transactional注解不生效,需要在外层方法(create())添加@Transactional注解才会生效。以上两个方法create1和create2均加有 @Transactional注解,但是这种方式不会生效,create1会执行成功并提交到数据库,create2的事务2会成功插入数据库,但是事务3不会插入数据库,从而引发了数据的不一致性。

 

    @Override
    public boolean create() {
        studentService2.create1();
        studentService2.create2();
        return true;
    }
StudentService:

@Transactional(rollbackFor = {RuntimeException.class, Error.class}) public void create1() { Student student = new Student(); student.setName("事务1"); //不能为空 student.setGender(1); int result = studentMapper.insert(student); if (result != 1) { throw new RuntimeException("新增失败"); } } @Transactional(rollbackFor = {RuntimeException.class, Error.class}) public void create2() { Student student = new Student(); student.setName("事务2"); student.setGender(1); studentMapper.insert(student); Student student2 = new Student(); student2.setName("事务3"); int result = studentMapper.insert(student2); if (result != 1) { throw new RuntimeException("新增失败"); } }

此种方式事务生效,事务1能够成功保存到数据库,事务2和事务3因为异常无法保存到数据库。

 

标签:事务,JAVA,student,RuntimeException,Transactional,result,Student,new,失效
From: https://www.cnblogs.com/hx-web/p/18298206

相关文章

  • JAVA初级之File文件类
    目录1、概述2、构造方法 3、常用方法3.1获取功能的方法 3.2绝对路径和相对路径 3.3判断功能的方法 3.4创建删除的方法 3.5对目录的遍历4、经典案例4.1查询某个目录下所有的文件。 4.2 找到电脑中所有以avi结尾的电影。1、概述        在......
  • windows使用bat文件 执行java程序
    java开发的程序想在windows上运行。首先要安装对应的java运行环境。然后创建一个 ***.bat文件,写入下面代码,双击它。@echoofftitleLSpbxServercd\d:cd"javaapp\LSpbxServer"java-jarLSpbxServer.jarpausetitleLSpbxServer是这个cmd.exe窗体的标题,同时......
  • 基于Java+Vue的采购管理系统:实现采购业务数字化变革(整套代码)
    前言:采购管理系统是一个综合性的管理平台,旨在提高采购过程的效率、透明度,并优化供应商管理。以下是对各个模块的详细解释:一、供应商准入供应商注册:供应商通过在线平台进行注册,填写基本信息和资质文件。资质审核:系统对供应商提交的资质文件进行自动或人工审核,确保供应商符......
  • Java中的Set系列集合超详解
     Set List是有序集合的根接口,Set是无序集合的根接口,无序也就意味着元素不重复。更严格地说,Set集合不包含一对元素e1和e2,使得e1.equals(e2),并且最多一个空元素。  使用Set存储的特点与List相反:元素无序、不可重复。常用的实现方式:HashSet、LinkedHashSet和TreeSet。......
  • JAVA初级之IO流
    目录1、概述1.1什么是IO1.2IO的分类1.3IO的流向说明图解1.4IO流的父类2、字节流2.1字节流概念2.2字节输出流【OutputStream】2.2.1字节输出流的基本方法 2.2.2 FileOutputStream类2.2.3写出字节数据2.2.3数据追加续写 2.2.4写出换行 2.3 字节输入......
  • 学生Java学习路程-2
    ok,到了一周一次的总结时刻,我大致会有下面几个方面的论述:1.这周学习了Java的那些东西2.这周遇到了什么苦难3.未来是否需要改进方法等几个方面阐述我的学习路程。这周主要通过网上找的一些课程来学习java,因为直接看项目它用的语句根本不知道什么意思,简直是一脸懵逼,但因为找的是零基......
  • Java集合之Collection集合详解
    目录Collection集合 List接口ArrayList集合LinkedList集合List集合遍历Iterator迭代器增强for循环forEach遍历集合Set接口HashSet集合TreeSet集合Collection集合 Collection集合最基本的集合接口,用于存储一系列元素。Collection集合有两个重要的子接口,分别......
  • Java代码初始化块
    目录实例域代码块静态域代码块初始化代码块分为静态域代码块和实例域代码块,静态域代码块在类第一次被加载时被执行,实例域代码块在创建对象时被执行,一个类中可以有多个代码块。 实例域代码块使用方法可以有输出语句可以对类的属性、类的声明进行初始化操作对集......
  • [0071]基于JAVA的上门服务费用智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的上门服务费用智慧管理系统的设计与实现指导老师(一)选题的背景和意义随着社会的发展,越来越多的服务行业开始注重服务质量和服务效率的提升,以满足消费者日益增长的需求。而上门服务作为一种方便......
  • [0074]基于JAVA的专利信息智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的专利信息智慧管理系统的设计与实现指导老师(一)选题的背景和意义在当今社会,知识产权保护越来越受到重视,专利作为知识产权的重要组成部分,其管理对于企业的创新能力和市场竞争力具有重要影响。然......