【问题标题】:Query about Spring Transaction configuration and propagation查询 Spring Transaction 配置和传播
【发布时间】:2012-01-25 09:16:09
【问题描述】:

在 spring 文档中是这样写的

关于 Spring 框架的声明式事务要掌握的最重要的概念 支持是通过 AOP 代理启用此支持,并且事务建议由 元数据(目前基于 XML 或注释)。

所以如果我使用

<tx:annotation-driven proxy-target-class="true" order="100"/>

在配置文件中,不要在我的 bean 上使用 @Transactional 注释。是否仍然支持事务,因为我正在使用 AOP,并且事务拦截器应该内置到我的 AOP 中,因此不使用显式使用 @Transactional 注释。

谢谢,

【问题讨论】:

  • 我没有使用 @Transactional 注释,但事情似乎仍然有效,我想知道它是如何在幕后发生的
  • 如果您没有明确表示事务边界,“一切都会奏效”。每个数据库操作将在完成后提交。

标签: java spring transactions


【解决方案1】:

不,您仍然必须使用 @Transactional 注释。 AOP 代理仅用于将事务相关的代码注入到您的代码中。

【讨论】:

  • 我没有使用 @Transactional 注释,但事情似乎仍然有效,我想知道它是如何在幕后发生的
  • @TarunSapra 在下面看到我的回答。
【解决方案2】:
  1. 用于自动检测'@Transactional'注解。所以必须要有一个。参考here

  2. proxy-target-class="true" 决定 Spring 应该使用 JDK 动态代理还是基于 CGLIB 类的代理。请参阅reference 了解更多信息。基本上,如果您的类实现了至少一个接口,则使用 JDK 动态代理。如果您有一个类 MyDaoImpl 扩展 MyDao 并且在您的服务中,您通过 MyDaoImpl myDaoImpl 注入 dao 引用,如果注释在您的接口上,JDK 动态代理将不起作用,因为类基代理是使用 proxy-target-class="true 创建的" 并且@Transactional 注解不会被继承。

  3. 您的查询似乎在没有@Transactional 的情况下工作的原因可能是因为您使用的是在内部打开和关闭事务的休眠模板。从 Spring 3 开始,建议直接注入 sessionFactory,不要使用 hibernate 模板。

希望这会有所帮助。

【讨论】:

  • 感谢您的信息,我正在使用 iBatis 的 SQLMapClientTemplate。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2017-05-31
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多