java 事务嵌套_Java事务以及嵌套事务[通俗易懂]

java 事务嵌套_Java事务以及嵌套事务[通俗易懂]最近遇到事务的处理,嵌套事务,自己研究,整理一下。1先看结论1、在Java事务中,事务的嵌套,如果有事务成功,那么则都成功,否则都不会成功。2、如果事务中存在异常,只要对异常进行捕获和处理,都为执行成功,否则都不会执行成功。2Propagation取值REQUIRED(默认值):在有transaction状态下执行;如当前没有transaction,则创建新的transaction;SUPPO…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

最近遇到事务的处理,嵌套事务,自己研究,整理一下。

1 先看结论

1、在Java事务中,事务的嵌套,如果有事务成功,那么则都成功,否则都不会成功。

2、如果事务中存在异常,只要对异常进行捕获和处理,都为执行成功,否则都不会执行成功。

2 Propagation取值

REQUIRED(默认值):在有transaction状态下执行;如当前没有transaction,则创建新的transaction;

SUPPORTS:如当前有transaction,则在transaction状态下执行;如果当前没有transaction,在无transaction状态下执行;

MANDATORY:必须在有transaction状态下执行,如果当前没有transaction,则抛出异常IllegalTransactionStateException;

REQUIRES_NEW:创建新的transaction并执行;如果当前已有transaction,则将当前transaction挂起;

NOT_SUPPORTED:在无transaction状态下执行;如果当前已有transaction,则将当前transaction挂起;

NEVER:在无transaction状态下执行;如果当前已有transaction,则抛出异常IllegalTransactionStateException。

3 预设场景

这里直接测试spring boot 使用spring data jpa添加一个用户进行测试

实体类user

@Data

@Entity

public class User {

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

@Column(name = “id”)

private long id;

private String userName;

public User(String userName) {

this.userName = userName;

}

}

UserRepository类

@Repository

public interface UserRepository extends CrudRepository {

}

UserService类

@Service

public class UserService {

@Autowired

UserRepository userRepository;

测试类

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest

public class UserServiceTest {

@Autowired

UserService userService;

}

4 实际场景使用

4.1 场景:并性事务

并行事务:

A:方法事务为默认的REQUIRED

B:方法事务为 REQUIRES_NEW 或者 REQUIRED

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest

public class UserServiceTest {

@Autowired

UserService userService;

@Test

public void test1() {

userService.addUser1(new User(“user1”));

userService.addUser2(new User(“user2”));

}

}

@Service

public class UserService {

@Autowired

UserRepository userRepository;

@Transactional(rollbackFor = Exception.class)

public void addUser1(User user) {

userRepository.save(user);

}

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

public void addUser2(User user) {

userRepository.save(user);

throw new RuntimeException();

}

}

执行结果:

保存了user1.

结论:并行事务不存在事务影响

4.2 场景:嵌套相同事务

a) 事务嵌套,在同一个事务中,没有对异常进行处理

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest

public class UserServiceTest {

@Autowired

UserService userService;

@Test

public void test2() {

userService.addUser3();

}

}

@Service

public class UserService {

@Autowired

UserRepository userRepository;

@Transactional(rollbackFor = Exception.class)

public void addUser3() {

userRepository.save(new User(“user3”));

this.addUser4(new User(“user4”));

}

@Transactional(rollbackFor = Exception.class)

public void addUser4(User user) {

userRepository.save(user);

throw new RuntimeException();

}

}

执行结果:两个都没有插入成功

结论:由于两个都是在一个事务当中,所以只要有一个方法事务有问题,那么都不会插入成功。

b) 事务嵌套,在同一个事务中,对异常进行处理

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest

public class UserServiceTest {

@Autowired

UserService userService;

@Test

public void test3() {

userService.addUser5();

}

}

@Service

public class UserService {

@Autowired

UserRepository userRepository;

@Transactional(rollbackFor = Exception.class)

public void addUser5() {

userRepository.save(new User(“user5”));

this.addUser6(new User(“user6”));

}

@Transactional(rollbackFor = Exception.class)

public void addUser6(User user) {

userRepository.save(user);

try {

throw new RuntimeException();

} catch (Exception e) {

e.printStackTrace();

}

}

}

执行结果:两个都插入成功。

结论:如果事务存在异常,并进行捕获处理,不会影响事务。

4.3 场景:嵌套不同事务

a)事务嵌套,在不同事务中,没有对异常进行处理

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest

public class UserServiceTest {

@Autowired

UserService userService;

@Test

public void test4() {

userService.addUser7();

}

}

@Service

public class UserService {

@Autowired

UserRepository userRepository;

@Transactional(rollbackFor = Exception.class)

public void addUser7() {

userRepository.save(new User(“user7”));

this.addUser8(new User(“user8”));

}

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

public void addUser8(User user) {

userRepository.save(user);

throw new RuntimeException();

}

}

执行结果:都没有插入成功。

结论:不同事务中,嵌套的事务,没有对异常进行处理,都不会执行成功。(其实在外部事务中出错,两个也是都不会插入成功数据。)

b)事务嵌套,在不同事务中,对异常进行处理

@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest

public class UserServiceTest {

@Autowired

UserService userService;

@Test

public void test5() {

userService.addUser9();

}

}

@Service

public class UserService {

@Autowired

UserRepository userRepository;

@Transactional(rollbackFor = Exception.class)

public void addUser9() {

userRepository.save(new User(“user9”));

this.addUser10(new User(“user10”));

}

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

public void addUser10(User user) {

userRepository.save(user);

try {

throw new RuntimeException();

} catch (Exception e) {

e.printStackTrace();

}

}

}

执行结果:都插入成功。

结论:不同事务,只要对异常进行捕获并处理,都会执行成功

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183608.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月10日 上午11:16
下一篇 2022年10月10日 上午11:36


相关推荐

  • @PostConstruct 注解详解

    @PostConstruct 注解详解最近在项目中发现了一个没见过的注解 PostConstruc 于是学习了一下 这里做一个记录 在 spring 项目经常遇到 PostConstruc 注解 首先介绍一下它的用途 被注解的方法 在对象加载完依赖注入后执行 此注解是在 JavaEE5 规范中加入的 在 Servlet 生命周期中有一定作用 它通常都是一些初始化的操作 但初始化可能依赖于注入的其他组件 所以要等依赖全部加载完再执行

    2026年3月26日
    2
  • 捣鼓PlantUML(三、时序图)

    捣鼓PlantUML(三、时序图)简单介绍时序图 SequenceDiag 又名序列图 循序图 顺序图 是一种 UML 交互图 它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作 它可以表示用例的行为顺序 当执行一个用例行为时 其中的每条消息对应一个类操作或状态机中引起转换的触发事件 PlantUML 使用 箭头将一条消息连接两个对象 参与者 对象本身不需要特别声明 如果想使用虚线箭头 则使用 箭头方向调转

    2026年3月17日
    4
  • onlaunch 异步_小程序onLaunch 与 onload 的异步问题(微信,支付宝实测可用)

    小程序app.js中onLaunch与index.js中onload的异步执行问题,在同时触发的情况下如何等待返回值而响应index中onload的内容比如说获取用户的openid或者凭证在没返回需要的数据之前index.js的onload会执行从而导致后续的代码没有openid的支持*ES6中提供了一个promise方案是一个不错的解决方案promise下载地…

    2022年4月14日
    95
  • Ubuntu安装JDK教程

    Ubuntu安装JDK教程Ubuntu安装JDK教程jdk的下载和安装:1、打开浏览器,输入jdk的官网地址:https://www.oracle.com/java/technologies/javase-downloads.html,如图:2、找到需要下载的jdk版本,这里以1.8版为例,找到JavaSE8,点击JDKDownload,跳转到JavaSE8的下载页面,如图:3、找到对应的下载版本,我这里是Ubuntu64位的系统,需要找到linux64的jdk版本,点击进行下载,如图:4、下载成之后

    2022年7月12日
    23
  • Linux——rpm安装

    Linux——rpm安装rpmrpm 软件包是 Linux 的各个发行版本中应用最为广泛的软件包格式之一 成为众多 Linux 发行版公认的软件包管理标准 最早由 RedHat 这家公司开发 RPM 优点 rpm 内包含已经编译过的程序于配置文件等数据 用户不需要重新编译 rpm 在被安装之前 会现检查系统的硬盘容量 操作系统版本等 可避免文件被错误安装 rpm 文件本身提供软件的版本信息 依赖属性检查 软件用途说明 软件所含文件等信息 便于了解软件 rpm 管理方式使用数据库记录 rpm 文件的相关参数 便于升级 删除 查询与验证 rp

    2026年3月17日
    1
  • js定义点击事件_回字四种写法

    js定义点击事件_回字四种写法嵌入式点击按钮脚本模型btn.onclick=function(){}W3C事件写法添加事件:appEventListener(事件名,事件函数,false)btn.addEventLi

    2022年8月5日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号