Spring事务失效场景之类内部方法调用及解决方案

这篇具有很好参考价值的文章主要介绍了Spring事务失效场景之类内部方法调用及解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

在日常开发中,经常有需要使用事务来保证数据一致性的情况。简单点的话直接在方法上面加@Transactional注解就可以了。
但这样存在一个问题,在整个业务方法层面加注解会把很多并不需要归入事务的操作也归入到了事务里面,这样会可能会出现大事务的情况,影响系统性能。
为了提高系统性能,比较好的一种方案是只把操作数据库的部分代码放到一个方法,给这个小方法加上事务,这样基本不会出现大事务的问题。而要实现这种方案,会碰上很常见的一种事务失效的场景。

二、事务失效场景

serviceImpl层

@Service
public class SdSchoolCallRecordServiceImpl extends ServiceImpl<SdSchoolCallRecordMapper, SdSchoolRlyCallRecord> implements ISdSchoolCallRecordService {

	@Override
	@Transactional(rollbackFor = Exception.class)
	public boolean test1() {
		SdSchoolRlyCallRecord callRecord=new SdSchoolRlyCallRecord();
		callRecord.setCallReason(2);
		this.save(callRecord);
		int a=10/0;
		SdSchoolRlyCallRecord callRecord1=new SdSchoolRlyCallRecord();
		callRecord1.setCallReason(6);
		this.save(callRecord1);
		return true;
	}
	@Override
	public boolean testTran1() {
		return this.test1();
	}
}

Controller层

	@GetMapping(value = "/tes1")
	@ApiOperation(value = "tes1", notes = "tes1")
	public Result<?> tes1() {
		sdSchoolCallRecordService.testTran1();
		return null;
	}

调用接口,看数据库,多了一条记录,事务回滚失败。
spring 事务 内部调用的几种场景,spring,数据库,oracle

三、新方式调用

ServiceImpl层(为了区分把值换成1)

@Service
public class SdSchoolCallRecordServiceImpl extends ServiceImpl<SdSchoolCallRecordMapper, SdSchoolRlyCallRecord> implements ISdSchoolCallRecordService {
	//注入自身
	@Resource
	private ISdSchoolCallRecordService sdSchoolCallRecordService;
	@Override
	@Transactional(rollbackFor = Exception.class)
	public boolean test1() {
		SdSchoolRlyCallRecord callRecord=new SdSchoolRlyCallRecord();
		callRecord.setCallReason(1);
		this.save(callRecord);
		int a=10/0;
		SdSchoolRlyCallRecord callRecord1=new SdSchoolRlyCallRecord();
		callRecord1.setCallReason(5);
		this.save(callRecord1);
		return true;
	}
	@Override
	public boolean testTran1() {
		//采用对象的方式调用方法
		return sdSchoolCallRecordService.test1();
	}
}

Controller层没有变化。

调用接口,查看数据库,没有记录,事务成功回滚。
spring 事务 内部调用的几种场景,spring,数据库,oracle

四、解析

Spring事务是通过动态代理实现的,而内部方法调用不走动态代理,因而方法上的注解就无法生效。(事务注解对应的类必须加上Component或Service注解)。
既然需要动态代理才能使用,那么针对这种方式,如果我们在类里面注入自身,然后通过对象调用不就也可以将事务交给事务管理器管理。调用方式也就和普通事务能生效的Service方法一样。文章来源地址https://www.toymoban.com/news/detail-797118.html

到了这里,关于Spring事务失效场景之类内部方法调用及解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring 事务失效的八种场景

    原因:Spring 默认只会回滚非检查异常 解法:配置 rollbackFor 属性 @Transactional(rollbackFor = Exception.class) 原因:事务通知只有捉到了目标抛出的异常,才能进行后续的回滚处理,如果目标自己处理掉异常,事务通知无法知悉 解法1:异常原样抛出: 在 catch 块添加 throw new RuntimeExc

    2024年02月14日
    浏览(40)
  • Spring事务传播机制、实现方式、失效场景即原理

    贴一篇源码分析的好文章:https://blog.csdn.net/qq_30905661/article/details/114400417 一个事务对应一个数据库连接。 通过 this 来调用某个带有 @Transactional 注解的方法时,这个注解是失效的 spring事务底层是通过数据库事务和AOP实现的 首先对于使用@Transactional的注解的bean,spring会创建一个

    2024年02月14日
    浏览(36)
  • Spring中事务失效的8中场景 对于一个事务开子线程

    1. 数据库引擎不支持事务 这里以 MySQL为例,MyISAM引擎是不支持事务操作的,一般要支持事务都会使用InnoDB引擎,根据MySQL 的官方文档说明,从MySQL 5.5.5 开始的默认存储引擎是 InnoDB,之前默认的都是 MyISAM,所以这一点要值得注意,如果底层引擎不支持事务,那么再怎么设置也

    2024年02月16日
    浏览(39)
  • 面试官让列举Spring的事务会失效的场景,我说了8个

    本文分享自华为云社区《哪些场景下Spring的事务会失效?》,作者:冰 河 。 在日常工作中,如果对Spring的事务管理功能使用不当,则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题,也是在跳槽面试中被问的比较频繁的一个问题。 今天,我们就一起梳理下有哪

    2024年02月11日
    浏览(40)
  • Spring 事务(Transactional)失效的七种原因及解决方案(含项目代码)

    “Spring框架提供了强大的事务管理功能,能够确保数据库操作的一致性和可靠性。然而,有时候我们可能会遇到Spring事务失效的情况,导致数据不一致或操作失败。本文将探讨Spring事务失效的原因,以及如何避免和解决这些问题。通过深入了解失效原因,我们可以更好地利用

    2024年04月10日
    浏览(41)
  • Transactional事务失效场景汇总

    作为后端程序员,在日常开发中,经常会遇到事务处理的场景,在Spring中,为了更好的支撑我们进行数据库操作,它提供了两种事务管理的方式: 编程式事务 声明式事务 那众所周知,我们平时用的最多的就是 声明式事务 ,也就是使用**@Transactional**注解的方式了 但是在日常

    2024年02月01日
    浏览(40)
  • spring动态代理失效,AOP失效,事务@Transactional失效原因

    事务基于@Transactional注解和AOP(动态代理) 对于基于接口动态代理的 AOP 事务增强来说,由于接口的方法都必然是 public 的,这就要求实现类的实现方法也必须是 public 的(不能是 protected、private 等),同时不能使用 static 的修饰符。所以,可以实施接口动态代理的方法只能是

    2024年02月15日
    浏览(50)
  • 遇到Spring事务失效,你该怎么办?

    Spring 事务场景失效是一个常见的问题。今天来分析这个问题。 失效原因 事务方法被final、static修饰:这是因为Spring事务的实现依赖于AOP技术,而final、static方法无法被代理,因此在这些方法中调用事务方法,事务无法生效。 方法访问权限不是public:Spring事务的实现也

    2023年04月15日
    浏览(48)
  • spring中事务失效的情况(常见的5种)

    1.多线程调用 从上面的例子中,我们可以看到事务方法add中,调用了事务方法doOtherThing,但是事务方法doOtherThing是在另外一个线程中调用的。 这样会导致两个方法不在同一个线程中,获取到的数据库连接不一样,从而是两个不同的事务。如果想doOtherThing方法中抛了异常,ad

    2024年02月13日
    浏览(36)
  • spring事物失效场景

    在使用SpringBoot的开发过程中,我们有时候会遇到明明加了事务但是却不生效的场景,今天就稍微整理一下。 在Spring Boot中,事务是基于注解或XML配置的方式进行声明的。如果一个方法没有被声明为事务,那么其中的数据库操作将不会受到事务管理的影响,可能导致数据不一致

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包