spring @Transactional 注解

2024-03-07

我有一个抽象类和两个扩展它的子类。我在 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() 仅执行一个本机 SQL 查询。如果我将 @Transactional 放在 imortDataToDB() 上,它会起作用,但它会使我的事务变得巨大,因为在该方法中,我循环遍历文件中的所有行并将记录插入数据库中。


这是 Spring 的主要陷阱之一 - 如果你打电话@Transactional-非事务方法的方法在同一个班, the @Transactional被忽略(除非您使用 AspectJ 编织)。这不是Spring的问题per se- EJB也有同样的缺点。

不幸的是,对于基于接口和基于类的代理,您所能做的就是将您的类分成两部分:

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 代理的内部实现引起的。使用上面的代码,每次您致电时都会启动新交易b.executeInsertUpdateQuery()来自非交易性BeanA.

I wrote about it on my blog Spring pitfalls: proxying http://nurkiewicz.blogspot.com/2011/10/spring-pitfalls-proxying.html, Spring AOP riddle http://nurkiewicz.blogspot.com/2009/08/spring-aop-riddle.html and Spring AOP riddle demystified http://nurkiewicz.blogspot.com/2009/09/spring-aop-riddle-demystified.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring @Transactional 注解 的相关文章

随机推荐

  • 如何从并行进程中运行的函数中检索值?

    Multiprocessing 模块对于 Python 初学者来说相当令人困惑 特别是对于那些刚刚从 MATLAB 迁移并因并行计算工具箱而变得懒惰的人 我有以下函数 运行时间约为 80 秒 我想通过使用 Python 的多处理模块来缩短这
  • 如何在 swift 3 中设置共享 URLCache?

    这是我们在 Swift 2 中的代码 Swift 3 版本是什么 我没有看到 setShared 的替代品 let sharedCache NSURLCache NSURLCache memoryCapacity 0 diskCapacit
  • Oauth2 用于授权和身份验证?

    Oauth2可以用于授权 and 验证 据我了解 Oauth2授权用于从提供商 例如 Facebook Google Twitter 等 访问用户信息的消费者应用程序 但是 Oauth2 可以用来吗认证用户 例如 假设我们有一个由本机移动前
  • 终止使用Python的subprocess.Popen()创建的进程[重复]

    这个问题在这里已经有答案了 这是我的想法 首先 我使用 subprocess Popen 创建了一个进程 其次 在一段时间后 我尝试通过 Popen kill 杀死它 import subprocess import os signal i
  • 确定控制台应用程序是从命令行还是从 Powershell 运行

    如何确定控制台应用程序是从 Powershell 运行还是从应用程序内的标准命令行运行 像这样的事情可能比检查窗口标题更可靠 using System using System Diagnostics Process p Process G
  • Cakephp 2.3.x 发送文件并强制下载 mp4 文件

    我正在使用 cakephp 2 3 1 我想强制下载一个 mp4 文件http book cakephp org 2 0 en controllers request response html cake response file htt
  • Protractor:onPrepare 不同的测试套件

    我登录应用程序的 conf js 文件中有 onPrepare 我的理解是每次我运行 1 个或多个测试套件时 它首先执行 onPrepare 中的任何内容 这很棒 因为我在运行测试之前使用 onPrepare 登录到应用程序 问题是 当我运
  • ggplot2中直方图条形的反向填充顺序

    我注意到 使用绘图创建的直方图中填充条形的默认情况是按字母顺序逆序排列 而图例则按字母顺序排列 我有什么办法让两者按字母顺序排序吗 问题在下面的示例图中很明显 额外问题 如何将从左到右的条形顺序从字母顺序更改为递减计数总数 谢谢 df lt
  • 在部分视图中进行不显眼的客户端验证

    我有一个在 jQuery UI 对话框中呈现的部分视图 因为它是动态内容 所以不引人注目的客户端验证不起作用 为了得到它 我必须强制验证器解析表单的内容调用 validator unobtrusive parse 但这不起作用 我的浏览器报
  • SQL 按版本“编号”排序,不同长度的字符串

    我正在尝试创建一个 SQL 查询 该查询将按版本号 例如 1 1 4 5 10 等 对结果进行排序 这是我尝试过的 SELECT FROM Requirements WHERE Requirements Release NOT LIKE O
  • 每周数据的时间序列分解

    我对 R 完全陌生 刚刚开始使用它 我有三年的每周数据 我想将这个时间序列数据分解为趋势 季节性和其他组成部分 我有以下疑问 我应该使用哪个功能 ts or decompose 如何应对闰年的情况 如果我错了请指正 频率是52 提前致谢 我
  • PyQt5 + Python 3:跨线程传递列表、字典作为信号参数

    我正在使用 pyqtSignal 将 python 列表作为参数从工作线程发送到主线程 qt 何时创建作为参数传递的对象的副本 根据 http www embeddeduse com 2013 06 29 copied or not cop
  • Java优化的Cramers规则函数

    最近了解了初级微积分中的 Cramers 规则 并决定用 Java 制作一个算法来帮助我更好地理解它 以下代码 100 正确运行 但是它不使用任何类型的 for 循环来以更简单的方式执行其操作 问题 Java 中是否有更优雅的 Cramer
  • 如何清除 IDLE shell 中所有文本的屏幕?

    我想为 python 游戏创建一个基于文本的 GUI 我打算在多行文本之间移动一个字符 经过几个小时的在线搜索后 我发现的解决方案对此不起作用 我想要一些能够擦除屏幕上所有文本的东西 这样我就可以重新打印同一行 但角色移动了一个空格 需要明
  • range() 不是每次都会计算它的参数吗?

    l作为参数传递给range其值在内部被修改的函数for循环 但循环是为了10次而不是5 i 0 l 10 for i in range l print i l l l 1 输出是 0 10 1 9 2 8 3 7 4 6 5 5 6 4 7
  • 无法打开应用程序“Eclipse”。 -10810

    更新android L Preview的SDK后 我尝试将ADT从adt 22更新到23 但它说版本冲突 所以无法更新ADT然后我通过about eclipse卸载了ADT插件 重新启动eclipse后没有打开 它显示警告 因为无法打开应用
  • 使用 jOOQ 实现带间隔的 date_sub() 函数

    我从昨天起就一直在处理这个问题 问题是我正在将查询迁移到jOOQ http www jooq org当我尝试实现这一部分时 我陷入了困境 select from table where condition1 and date1 gt dat
  • 登录 Groovy 脚本

    我有一个基本的 Groovy 脚本 我希望尽可能简单地创建日志 我希望消息发送到标准输出以及日志文件 并且日志文件中的每个条目都有一个时间戳 我无法使用 Log 表示法 因为它是一个脚本 而且我没有要注入的类 否则我认为这将是理想的 您可以
  • Laravel 验证独特

    我有一个带有唯一列的表 我的表单验证规则如下所示 return Validator make data nameEN gt required string nameHE gt required string address gt requi
  • spring @Transactional 注解

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