首页 > 其他分享 >事务回滚情况实战

事务回滚情况实战

时间:2022-11-17 19:11:33浏览次数:63  
标签:实战 insert 回滚 RuntimeException 事务 KsA new ksA

一、前置知识

1、Java异常中,Throwable是最顶层的父类,有Error和Exception两个子类
2、Exception分为运行时异常(RuntimeException及其子类)和非运行时异常(Exception子类中,除了RuntimeException及其子类之外的类)
3、使用spring的@Transactiona开启事务,默认Error和RuntimeException及其子类才会回滚
4、@Transactiona默认传播行为是REQUIRED,需要配合其他传播行为测试,请查看:Spring事务传播行为实战

二、情况

1、遇到异常回滚

  • Error和RuntimeException及其子类的异常
	// 回滚
	@Transactional
	public void add() {
		KsA ksA = new KsA();
		ksA.setName("林");
		ksAService.insert(ksA);
		throw new RuntimeException("运行报错啦");
		// throw new OutOfMemoryError();
	}
  • 非运行时异常
	// 不回滚
	@Transactional
	public void add2() throws IOException {
		KsA ksA = new KsA();
		ksA.setName("林");
		ksAService.insert(ksA);
		throw new IOException();
	}

2、捕获异常后不回滚

	@Transactional
	public void add() {
		KsA ksA = new KsA();
		ksA.setName("林");
		ksAService.insert(ksA);
		try {
			throw new RuntimeException("运行报错啦");
		} catch (RuntimeException e) {
			e.printStackTrace();
		}
	}

3、指定异常才回滚

	// 回滚
	@Transactional(rollbackFor = NullPointerException.class)
	public void add() {
		KsA ksA = new KsA();
		ksA.setName("林");
		ksAService.insert(ksA);
		int forlan = 1 / 0;
	}

分析说明:这里虽然抛出的是ArithmeticException,但我们指定是NullPointerException才会回滚,为什么还是回滚了呢?
其实这两个类都是继承RuntimeException,Spring本来就默认了RuntimeException子类也是回滚的

rollbackFor参数,针对的是非运行时异常,实现一个追加拓展

	// 回滚
	@Transactional(rollbackFor = IOException.class)
	public void add2() throws IOException {
		KsA ksA = new KsA();
		ksA.setName("林");
		ksAService.insert(ksA);
		throw new IOException();
	}

4、指定异常不回滚

	// 不回滚
	@Transactional(noRollbackFor = ArithmeticException.class)
	public void add2() {
		KsA ksA = new KsA();
		ksA.setName("林");
		ksAService.insert(ksA);
		int forlan = 1 / 0;
	}

5、指定部分代码回滚

// ks_a表数据插入成功,ks_b数据回滚
@Transactional
	public void add3() {
		KsA ksA = new KsA();
		ksA.setName("林");
		ksAService.insert(ksA);
		Object savepoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
		try {
			KsB ksB = new KsB();
			ksB.setAge(10);
			ksBService.insert(ksB);
			throw new RuntimeException("父方法报错");
		} catch (Exception e) {
			TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savepoint);
		}
	}

标签:实战,insert,回滚,RuntimeException,事务,KsA,new,ksA
From: https://www.cnblogs.com/huozhonghun/p/16900488.html

相关文章

  • Spring —— 事务简介
    Spring事务简介事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败 小案例     ......
  • 一次分布式锁与数据库事务的纠缠
    有一个需要保证并发安全性的方法,考虑到锁的粒度与分布式要求,选择了基于Redis的分布式锁。需要保证并发安全性的原因是该方法会并发操作数据库某表中的数据。......
  • Spring中手动控制事务
    在spring中大部分时候使用的是声明式事务,也就是@Transaction注解,但在某些特殊情况下也需要手动控制事务的开启/提交/回滚。工具类封装:1@Component2pu......
  • 1、Spring事务失效的几种原因
    Spring事务失效的几种原因1、Bean没有被Spring管理,即类上没有加入@Service、@Component等注解。2、方法没有使用public修饰加@Transactional注解的方法必须用public关键......
  • 网工必备技术-华为交换技术实战讲解
    学习目标:通过案例,了解Hybrid接口应用场景及如何配置;MSTP实现负载均衡基础内容:1、Hybrid接口特点华为交换机接口默认为Hybrid模式既可以实现Access接口的功能,也可以实现Trunk......
  • 【2022-11-16】luffy项目实战(九)
    一、celery介绍Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具。它是一个任务队列,专注于实时处理,同时还支持任务调度。......
  • C++并发编程实战 第二版 电子书 pdf
    作者:安东尼·威廉姆斯(AnthonyWilliams)出版社:人民邮电出版社出品方:异步图书原作名:C++ConcurrencyinAction,SecondEdition 链接:C++并发编程实战第二版 ......
  • Logstash 入门实战(4)--filter plugin 介绍
    本文主要介绍Logstash的一些常用过滤插件;相关的环境及软件信息如下:CentOS 7.9、Logstash8.2.2。1、grok过滤插件grok是一种将行与正则表达式匹配,将行的特定部分映射到......
  • 12.Seata:Spring Cloud Alibaba分布式事务组件(非常详细)
    随着业务的不断发展,单体架构已经无法满足我们的需求,分布式微服务架构逐渐成为大型互联网平台的首选,但所有使用分布式微服务架构的应用都必须面临一个十分棘手的问题,那就是......
  • Java: Seata实战部署使用
    目录背景基础概念TC(TransactionCoordinator)-事务协调者TM(TransactionManager)-事务管理器RM(ResourceManager)-资源管理器tx-service-group-事务分组vgro......