【问题标题】:@Transactional annotation doesn't work@Transactional 注释不起作用
【发布时间】:2010-10-12 17:58:28
【问题描述】:

好的,够了。我无法完成这项工作。我是 Spring 事务的新手,并在我的服务中使用 @Transactional 注释来管理事务。下面是我的spring bean配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">

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

  <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
  </bean>

  <jee:jndi-lookup id="dataSource" jndi-name="jdbc/myapp"/> 

  <!-- other <bean/> definitions here -->

</beans>

我为我的服务添加注释:

@Transactional
public class MyServiceImpl implements MyService {
...
}

我注意到两件事

  1. 我在 DAO [使用 DataSourceUtils.getConnection(dsName)] 中获得的连接启用了自动提交 [true]。
  2. 据我调试,在我的服务方法调用期间似乎没有任何事务已开始。

有人遇到过这个问题吗?

【问题讨论】:

  • 只是为了确保:您的 MyServiceImpl 是 Spring bean,而不是由 new 创建的,是吗?
  • 是的,它是通过 Spring 注入的
  • santhakr:另一个问题 - 您的 MyServiceImpl 是否在与 &lt;tx:annotation-driven&gt; 相同的应用程序上下文中声明?
  • 您是否有一些 xml 用于扫描类以查找注释?
  • 如果 MyServiceImpl 是由 spring 注入的,它在哪里定义?它不在上面的文件中...

标签: java spring transactions


【解决方案1】:

我自己使用 Hibernate 和 HibernateTransactionManager,所以我不太熟悉 JDBC 事务管理器的工作原理。您是否检查过调用堆栈以查看 TransactionInterceptor 是否在其中?如果是,那么事务注释正在工作,您可能只是缺少其他东西。如果您还没有寻找它,是什么让您认为它不起作用?为了消除显而易见的问题,您是否在 JDBC 配置中明确设置了禁用自动提交的设置?

【讨论】:

  • 我在我的调用堆栈中没有看到 TransactionInterceptor - 无论我在多大程度上了解查看代码,DataSourceTransactionManager 的 doBegin 方法都没有被调用,因为该方法创建连接并显式地自动提交到错误的。当我跟踪调试器时,我注意到仅在调用 DataSourceUtil.getConnection(dsName) [使用 dataSource.getConnection() 并启用自动提交] 期间创建连接,并且没有可用的连接。
  • 您尚未在 根元素中定义 tx 命名空间。应用程序如何启动?在开始使用 tx-namespace 功能之前,您需要在其中拥有它(如 jee 命名空间)。
  • 抱歉,把代码复制到这里是我的错。我确实有 tx 命名空间。再次抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
相关资源
最近更新 更多