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

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

}

}

}

执行结果:都插入成功。

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

java 事务嵌套_Java事务以及嵌套事务相关推荐

  1. 事务嵌套 、事务挂起、事务传播特性

    事务嵌套 .事务挂起.事务传播特性 即多个事务方法嵌套调用时 父子方法的事务如何嵌套.合并.管理 场景 方法啊调用方法b 方法b是事务方法 方法a不确定时(a可能有事务注解) 具体七种 propaga ...

  2. java 事务嵌套_解惑 spring 嵌套事务

    解惑spring嵌套事务 在所有使用spring的应用中,声明式事务管理可能是使用率最高的功能了,但是,从我观察到的情况看,绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义,让我们来看一 ...

  3. java hibernate详细_Java事务管理学习之Hibernate详细介绍

    hibernate是jdbc轻量级的封装,本身不具备事务管理的能力,在事物管理层面,一般是委托于底层的jdbc和jta来完成调度的.下面这篇文章主要给大家介绍了Java事务管理学习之Hibernate ...

  4. java jta 例子_Java事务与JTA

    一.什么是JAVA事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令.更简答的说就是:要么 ...

  5. java for 嵌套_Java中的for循环嵌套

    Java嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构.whiledo.while.for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,如最常见的在for循环中嵌套for循环, ...

  6. java中使用事务案例_Java事务之四——成功的案例

    在本系列的上一篇文章中我们讲到,要实现在同一个事务中使用相同的Connection对象,我们可以通过传递Connection对象的方式达到共享的目的,但是这种做法是丑陋的.在本篇文章中,我们将引入另外 ...

  7. java中事务特性_java事务的四大特性ACID

    前言 对于要把事务在实际中使用好,需要了解事务的特性. 事务的四大特性主要是:原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability ...

  8. java 循环嵌套_Java的循环结构及嵌套循环

    Java的循环结构及嵌套循环 Java的循环结构while 循环结构do...while 循环结构for 循环结构 Java的嵌套循环概念循环控制语句breakcontinuereturn forea ...

  9. java iterator 嵌套_Java中的集合嵌套

    import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set;publ ...

  10. java 对象嵌套_java如何把嵌套的对象装入集合?

    树形对象,自身嵌套的(Java8): 类: A , 里面包含一个LinkedList 的 A 的子对象集合 public class A implements Serializable { A(Str ...

最新文章

  1. linux不能挂载手机,这个无法挂载的信息是怎么回事?
  2. rsync远程同步的基本配置与使用
  3. cout 输出指定位数,不足补0
  4. fanuc机器人提示暂停_川崎机器人故障排除参考方法
  5. 深度案例 | 纷享销客:用户需求精准洞察下的敏捷开发
  6. java 包权限_Java基础(十二)之包和权限访问
  7. Eclipse里web的依赖工程部署的简便方法
  8. 操作系统饥饿现象_操作系统常见面试题
  9. 容器编排技术 -- Kubernetes 应用连接到 Service
  10. OpenCV阶段总结扩充。
  11. 【JVM】4、JVM类加载机制
  12. (229)DPU加速数据处理
  13. java 中反射的使用_java中反射的基本使用
  14. 12、URL后端编码解码工具
  15. ImageAI (一) 使用Python快速简单实现图像内容预测 Image Prediction
  16. c/c++进制转换方法汇总(含全部代码)
  17. 《C++ SYNTAX》第1章 基础知识
  18. python手机app签到_Python实现App自动签到领取积分功能
  19. 华为路由器 上网慢 延迟高 解决方法
  20. status_breakpoint谷歌浏览器如何解决?

热门文章

  1. 保存网页图片的八种方法
  2. Unity DOTween插件和iTween插件使用(笔记)
  3. 2022年某市新型智慧城市一网统管顶层设计方案(WORD)
  4. layabox 场景文件类型有哪些?
  5. 使用自定义文件选择按钮选择文件
  6. 微信卡券管理 - 修改卡券基本信息
  7. 批量下载微软官网上的桌面壁纸图片
  8. Struts1和Struts2对比
  9. Java文件上传【通用】
  10. Unity 批量复制transform值,并批量粘贴