gpt4 book ai didi

java - spring @Transactional注解

转载 作者:搜寻专家 更新时间:2023-10-31 19:41:05 28 4
gpt4 key购买 nike

我有一个抽象类和两个扩展它的子类。我在 spring 配置文件中有以下内容

<bean id="importConfigFile" class="xxx.ImportConfigFiles" parent="parentImportFile"></bean>

<bean id="importFile" class="xxx.ImportUMTSKPIFiles" parent="parentImportFile"></bean>

<bean id="parentImportFile" name="parentImportFile" class="xxx.ImportUMTSFiles" abstract="true"></bean>

<tx:annotation-driven transaction-manager="transactionManager" />

在我的抽象类中我有以下方法

public void importDataToDB(){
//all the good stuff goes in here
}

@Transactional
public void executeInsertUpdateQuery(){
//all the good stuff goes in here
}

我的java代码

ImportConfigFiles importConfigFiles = (ImportConfigFiles)context.getBean("importConfigFile");
importConfigFiles.setFileLocation(destPath);
importConfigFiles.importDataToDB();

这是行不通的。 executeInsertUpdateQuery() 只执行一个 native sql 查询。如果我将 @Transactional 放在 imortDataToDB() 上,它可以工作,但它会使我的事务变得巨大,因为在该方法中我循环遍历文件中的所有行并将记录插入数据库中。

最佳答案

这是 Spring 中的主要陷阱之一 - 如果您从同一类中的非事务方法调用@Transactional方法,@Transactional 被忽略(除非您使用 AspectJ 编织)。这不是 Spring 问题本身 - EJB 有同样的缺点。

不幸的是,对于基于接口(interface)和基于类的代理,您所能做的就是将您的类一分为二:

public class BeanA() {

@Resource
private BeanB b;

public void importDataToDB(){
b.executeInsertUpdateQuery();
}
}

public class BeanB {

@Transactional
public void executeInsertUpdateQuery(){
//all the good stuff goes in here
}

}

整个喧嚣是由 Spring 中 AOP 代理的内部实现引起的。使用上面的代码,每次您从非事务性 BeanA 调用 b.executeInsertUpdateQuery() 时,都会启动新事务。

我在我的博客上写过它 Spring pitfalls: proxying , Spring AOP riddleSpring AOP riddle demystified .

关于java - spring @Transactional注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9020135/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com