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();

}

}

}

执行结果:都插入成功。

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 电脑中恶意插件后自动安装软件一般有哪些?(软件及安装路径整理中,持续更新)

    电脑中恶意插件后自动安装软件一般有哪些?(软件及安装路径整理中,持续更新)使用windows系统的小伙伴经常会下载安装各种软件,可能非官网途径获取的软件中带有恶意插件导致系统各种弹窗并伴随着各种垃圾软件的自动安装。下面就常见的恶意软件安装路径整理,持续更新C盘 ProgramFiles EXEDOWN servicewin.exe ProgramFiles(x86) AppInsghtesly W…

  • 局域网vlan配置步骤_局域网vlan划分案例

    局域网vlan配置步骤_局域网vlan划分案例计算机网络技术的发展犹如戏剧舞台,你方唱罢我登台。从传统的以太网(10Mb/s)发展到快速以太网(100Mb/s)和千兆以太网(1000Mb/s)也不过几年的时间,其迅猛的势头实在令人吃惊。而现在中大型规模网络建设中,以千兆三层交换机为核心的所谓“千兆主干跑、百兆到桌面”的主流网络模型已不胜枚举。现在,网络业界对“三层交换”和VLAN这两词已经不感到陌生了。一、什么是三…

  • AllinOne安装OpenStack

    AllinOne安装OpenStack1.虚拟机的配置准备内存:8G+CPU:2|2网络设置:NAT硬盘设置:100G+2.启动虚拟机3.网络配置vi/etc/sysconfig/network添加内容:NETWORKING=yes

    2022年10月25日
  • MFC之document与view实践总结

    1.视图的同步更新UpdateAllViews>OnUpDate>WM_PAINT>OnDrawUpdateAllView(NULL)表示更新所有视图同时也可以根据U

    2021年12月28日
  • 35岁以上的IT人士如果有一天被公司裁员了,该怎么办?

    35岁以上的IT人士如果有一天被公司裁员了,该怎么办?我觉得裁员和年龄无关,和本人的技能,工作态度,处事规则有关系。大家都知道华为裁员比例厉害,特别是对35岁以上的,会感到中年危机。但是我几个在华为的同学,都到了40岁了工作依然好好的,也没有见谁被裁掉。如果在工作中保持积极的态度,做事主动,平常多学习,和同事,领导的关系都不错,那么也不会被裁掉。作为已经到而立之年的中年人,给大家一点建议吧。在工作和生活中时刻保持乐观的心态,做事积极主动,多想多思考,与同事和领导友好相处,尽量让自己成为不可替代的人。那么你就不会被裁掉,也不会有中年危机。…

  • Codeforces 432 D. Prefixes and Suffixes

    Codeforces 432 D. Prefixes and Suffixes

发表回复

您的电子邮箱地址不会被公开。

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