Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:@Transactional@Scheduled方法引发TransactionException_Java_Spring_Hibernate_Spring Annotations - Fatal编程技术网

Java Spring:@Transactional@Scheduled方法引发TransactionException

Java Spring:@Transactional@Scheduled方法引发TransactionException,java,spring,hibernate,spring-annotations,Java,Spring,Hibernate,Spring Annotations,(对Spring来说还是有点陌生) 我需要有一个同时是@Scheduled和@Transactional的服务方法,以便在其中调用DAO 如果启用了声明性事务,则事务管理器是基于hibernate会话工厂的org.springframework.orm.hibernate3.HibernateTransactionManager 服务类未实现任何接口,因此使用CGLIB代理 此设置通常运行良好(从web堆栈调用的方法,即Struts),但此方法在调度程序调用时引发异常 以下是相关的代码位: 服务

(对Spring来说还是有点陌生)

我需要有一个同时是
@Scheduled
@Transactional
的服务方法,以便在其中调用DAO

如果启用了声明性事务,则事务管理器是基于hibernate会话工厂的
org.springframework.orm.hibernate3.HibernateTransactionManager

服务类未实现任何接口,因此使用CGLIB代理

此设置通常运行良好(从web堆栈调用的方法,即Struts),但此方法在调度程序调用时引发异常

以下是相关的代码位:

服务方法(该类称为
ClientWakeAndTerminateManager
):

我的应用程序上下文的相关部分:

<!-- switch on the transactional infrastructure -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

    <!-- Utility class to execute transactional code where use of annotation is not possible -->
    <bean class="org.springframework.transaction.support.TransactionTemplate" id="txTemplate">
        <constructor-arg name="transactionManager" ref="transactionManager"/>
    </bean>

    <!-- Transaction manager based on Hibernate -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="hibernateSessionFactory"/>
    </bean>

异常堆栈跟踪:

[ERROR] : Unexpected error occurred in scheduled task.
org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:661)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:475)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:270)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
    at ch.unine.sitel.lis.rmi.shared.ClientWakeAndTerminateManager$$EnhancerByCGLIB$$d8be4f34.runCheck(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:64)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.hibernate.TransactionException: Transaction not successfully started
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:127)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:657)
    ... 22 more
[错误]:计划任务中发生意外错误。
org.springframework.transaction.TransactionSystemException:无法提交Hibernate事务;嵌套异常为org.hibernate.TransactionException:事务未成功启动
位于org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:661)
位于org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:755)
位于org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)
位于org.springframework.transaction.interceptor.TransactionSpectSupport.commitTransactionAfterReturning(TransactionSpectSupport.java:475)
位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:270)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172)
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
在ch.unine.sitel.lis.rmi.shared.ClientWakeAndTerminateManager$$enhancerbyglib$$d8be4f34.runCheck()中
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:601)
位于org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:64)
位于org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:53)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
位于java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:351)
位于java.util.concurrent.FutureTask.runAndReset(FutureTask.java:178)
位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
运行(Thread.java:722)
原因:org.hibernate.TransactionException:事务未成功启动
位于org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:127)
位于org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:657)
... 还有22个
堆栈跟踪似乎告诉我确实使用了事务代理,所以我不理解这个异常。救命啊

编辑:

我试图通过以下方式将
@事务性
@计划的
注释分开:

  • 创建包含
    @Scheduled
    方法的新类/bean
  • 将我的服务注入这个bean
  • 从原始方法中删除了
    @Scheduled
    ,但保留了
    @Transactional

但我还是得到了同样的例外。我还尝试将
@Transactional
放在我的DAO方法上,并将其从我的服务方法中删除:结果相同。

使用
@Transactional
注释的方法创建单独的类,并在您的
@Scheduled
注释方法中调用此方法。spring将通过代理进行调用,并正确处理
@Transactional

编辑: 还要查看DAO方法,确保它不会手动提交或回滚事务

@EnableTransactionManagement

没有使用。在我将此注释添加到@Configuration类中后,它开始工作。

当已经提交或回滚的事务尝试提交或回滚时,可能会发生这种情况。您可以显示您的dao方法吗?好的,我的dao方法是错误的。我开始怀疑,然后你的评论让我看了两遍。因此,该方法包含一些剩余的手动会话提交(我最近正在对该应用进行现代化和“弹性化”),因此,当事务代理调用提交时,它失败了,因为它已经提交了!谢谢你抽出时间。如果你编辑你的答案来提到DAO方法,我会接受它。谢谢@wedens的回答,这对我来说很有用。你能解释一下为什么当方法在同一个类中时它不起作用。我知道,非常非常非常旧的帖子,但我不想让问题挂起。原因在于代理的工作方式。最简单的答案是,它可以看到进出的东西,但看不到里面发生了什么。这是由于代理的性质。
@EnableTransactionManagement