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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言入门教程–1选择编译器,进行第一段代码

    c语言入门教程–1选择编译器,进行第一段代码

    2021年3月12日
    216
  • 深度学习 — BP算法详解(误差反向传播算法)「建议收藏」

    深度学习 — BP算法详解(误差反向传播算法)「建议收藏」本节开始深度学习的第一个算法BP算法,本打算第一个算法为单层感知器,但是感觉太简单了,不懂得找本书看看就会了,这里简要的介绍一下单层感知器:图中可以看到,单层感知器很简单,其实本质上他就是线性分类器,和机器学习中的多元线性回归的表达式差不多,因此它具有多元线性回归的优点和缺点。单层感知器只能对线性问题具有很好的解决能力,但是非线性问题就无法解决了,但是多层感知器却可以解决非线性问题,多层感…

    2022年5月3日
    95
  • ffprobe参数详解(基于版本4.0.1)

    ffprobe参数详解(基于版本4.0.1)Simplemultimediastreamsanalyzerusage:ffprobe[OPTIONS][INPUT_FILE]Mainoptions:-L         showlicense-htopic      showhelp-?topic      showhelp-helptopic    …

    2025年6月6日
    3
  • goland2021.2.1激活破解破解方法

    goland2021.2.1激活破解破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    173
  • PS命令大全

    PS命令大全简介 Linux 中的 ps 命令是 ProcessStatu 的缩写 ps 命令用来列出系统中当前运行的那些进程 ps 命令列出的是当前那些进程的快照 就是执行 ps 命令的那个时刻的那些进程 如果想要动态的显示进程信息 就可以使用 top 命令 要对进程进行监测和控制 首先必须要了解当前进程的情况 也就是需要查看当前进程 而 ps 命令就是最基本同时也是非常强大的进程查看命令 使用该命令可以确定有哪些进程正在运

    2025年7月26日
    3
  • 【shell案例】CentOS7安装MySQL脚本案例

    【shell案例】CentOS7安装MySQL脚本案例前言此脚本为一个学员在工作中遇到在centos7中安装mysql的问题,于是安排一个学员花了15分钟写了一个脚本,可以正常安装使用。mysql的版本为5.7版本此脚本涉及到安装好mysql后,日志中没有临时密码的问题,所以该学员使用了破解mysql密码登陆修改去修改密码的方法,也算是一种好方法,在工作中,能解决问题才是根本,其他的技巧都是扯淡。虽然脚本还存在一些问题,但测试后发现可以正常安装,敢写就是一种进步。脚本源码因时间紧张,该学员未加注释,但我相信只要学完了shell基础的小伙伴都可以看懂

    2022年5月27日
    31

发表回复

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

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