【发布时间】:2014-12-23 16:20:16
【问题描述】:
我已启用我的 Spring 应用程序以使用事务并相应地注释了我的服务方法,但是当引发 RuntimeException 时,对我的数据库的更改仍然存在。
我的 Spring 配置如下所示:
<!-- Data Source. -->
<jee:jndi-lookup id="dataSource" jndi-name="java:/jdbc/BeheermoduleDS"/>
<!-- JPA Entity Manager. -->
<jee:jndi-lookup id="entityManagerFactory" jndi-name="java:/jpa/BeheermoduleDS"/>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
我的 jboss 配置文件中的数据源配置如下所示:
<datasource jta="true" jndi-name="java:/jdbc/BeheermoduleDS" pool-name="BeheermoduleDS" enabled="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:sqlserver://localhost:1433;databaseName=Gebruikers;</connection-url>
<driver>sqljdbc</driver>
<security>
<user-name>jboss</user-name>
<password>*****</password>
</security>
</datasource>
我的服务方法如下所示:
@Transactional
public void authorise(Gebruiker user) {
user.setStatus(GebruikerStatus.Actief.name());
gebruikerRepo.save(user);
if (true) {
throw new RuntimeException("Exception happened just like that");
}
// does more stuff here that is never reached
}
我的存储库扩展了一个 spring 数据存储库,如下所示:
public interface GebruikerRepository extends PagingAndSortingRepository<Gebruiker, Long>, QueryDslPredicateExecutor<Gebruiker> {
}
事务被一个控制器抛出并捕获,该控制器只向用户显示发生异常的消息。当我检查我的 SQL Server 数据库时,对用户状态所做的更改已提交。
它们不应该被 RuntimeException 回滚吗?
为 org.springframework.transaction.interceptor 打开调试后我看到我的服务方法没有启动任何事务,但它们是为一堆 JpaRepository 方法启动的。
另外,这就是我的 persistence.xml 的样子:
<persistence-unit name="BeheermodulePU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:/jdbc/BeheermoduleDS</non-jta-data-source>
【问题讨论】:
-
为了更清楚,您可以粘贴控制器代码吗?我假设控制器代码没有@Transactional 注释。
-
不,我没有用 &Transanction 注释它。它只有 @Controller 和 &Request 注释。
-
顺便说一句,Stackoverflow 不允许我在每个帖子中使用多个 @。
-
事务没有回滚很奇怪。您能否通过以下方式确认事务是否真的被应用 1. 调试并验证代码是否到达 TransactionInterceptor 类和 2. 使用 SQL Profiler 查看是否执行了“begin tran”语句。
-
是的,感谢您的提示。我为拦截器打开了调试,我得到了一堆 SimpleJpaRepository.findOne 方法的启动/完成事务,但我没有看到为我的方法记录的任何内容。
标签: sql-server spring-mvc spring-data spring-transactions runtimeexception