Java 从quartz作业读取/写入数据库-事务不工作

Java 从quartz作业读取/写入数据库-事务不工作,java,spring,oracle,transactions,quartz-scheduler,Java,Spring,Oracle,Transactions,Quartz Scheduler,我有两个Quartz(1.8.3)作业,通过Spring(2.5.6)配置,其中一个写入(发送)到数据库,另一个读取(检查) 其中ptm是一个TransactionManager bean,通过Spring注入。 我在日志中看到“Status was updated”记录,但当我从事务读取方法中读取该记录时,它有时会过时。此外,当我使用SQL编辑器读取此记录时,它也过时了。 我不明白,为什么交易在这种情况下不起作用,你有什么想法吗? 谢谢。对于任何可能感兴趣的人。这对我有用 <bean n

我有两个Quartz(1.8.3)作业,通过Spring(2.5.6)配置,其中一个写入(发送)到数据库,另一个读取(检查)

其中ptm是一个TransactionManager bean,通过Spring注入。 我在日志中看到“Status was updated”记录,但当我从事务读取方法中读取该记录时,它有时会过时。此外,当我使用SQL编辑器读取此记录时,它也过时了。 我不明白,为什么交易在这种情况下不起作用,你有什么想法吗?
谢谢。

对于任何可能感兴趣的人。这对我有用

<bean name="applicationDataCollectorControllerJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="org.mypckage.controller.jobs.ApplicationDataCollectorController" />
    <property name="jobDataAsMap">
        <map>
            <!--<entry key="timeout" value="1" />-->
            <entry key="genericService" value-ref="genericService" />


            <entry key="applicationDataCollectorService" value-ref="applicationDataCollectorService" />

            <entry key="transactionManager" value-ref="transactionManager" />

        </map>
    </property>



</bean>
----在applicationDataCollectorService bean中-----

public void collectData(org.springframework.transaction.jta.JtaTransactionManager transactionManager){
试一试{
this.transactionManager=transactionManager;
testTransactionalSave();
}捕获(例外e){
忙=假;
e、 printStackTrace();
}
}
}
私有void testTransactionalSave()引发异常{
TransactionTemplate tt=新TransactionTemplate(transactionManager);
tt.execute(newtransactioncallbackwithoutresult(){
@凌驾
受保护的无效doInTransactionWithoutResult(TransactionStatus ts){
试一试{
应用程序参数appPara=null;
List-appParaList=genericService.getListFromHQL(“从ApplicationParameter中选择o作为o order by o.id desc”,false);
如果(appParaList!=null){
如果(appParaList.size()>0){
appPara=(ApplicationParameter)appParaList.get(0);
appPara.setLastBankStatementMailNum(appPara.getLastBankStatementMailNum()+10);
appPara=(ApplicationParameter)genericService.mergeObject(appPara);
System.out.println(“num is now=“+appPara.getLastBankStatementMailNum());
}
}
}捕获(例外情况除外){
例如printStackTrace();
}
}
});
}

注意:不要忘记将transactionManager声明为bean中的私有属性,并使用public setter和getter for spring将其连接起来。有问题吗?yemiosigbesan@gmail.com

statusDAO
transactionnal(例如带有@transactionnal注释)?您是否仍然存在此问题?如果问题“有时”发生(但每次都打印日志消息),则很可能意味着您的持久性逻辑有缺陷(JDBC或Hibernate?)。使用所有嵌套调用检查“doInTransactionWithoutResult”函数的内容。我需要更多的代码才能更精确。如果您可以创建最小的测试隔离问题,这将有所帮助。nico_ekito,statusDAO不是事务性的,事务处于较高级别。
<tx:annotation-driven transaction-manager="TransactionManager"/>
@Override
    public synchronized void sendMessage() {
        try {
            TransactionTemplate tt = new TransactionTemplate(ptm);
            tt.execute(new TransactionCallbackWithoutResult() {
                @Override
                protected void doInTransactionWithoutResult(TransactionStatus status) {
                    ...
                    statusDAO.update(status);
                    ...
                }
            });
            log.info("Status was updated");
        } catch (Exception e) {
            ...
        }
    }
<bean name="applicationDataCollectorControllerJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="org.mypckage.controller.jobs.ApplicationDataCollectorController" />
    <property name="jobDataAsMap">
        <map>
            <!--<entry key="timeout" value="1" />-->
            <entry key="genericService" value-ref="genericService" />


            <entry key="applicationDataCollectorService" value-ref="applicationDataCollectorService" />

            <entry key="transactionManager" value-ref="transactionManager" />

        </map>
    </property>



</bean>
@Override
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {

getApplicationDataCollectorService().collectData(transactionManager);


}
public void collectData( org.springframework.transaction.jta.JtaTransactionManager transactionManager) {



        try {
            this.transactionManager = transactionManager;
            testTransactionalSave();

        } catch (Exception e) {
            BUSY = false;
            e.printStackTrace();
        }

    }

}

private void testTransactionalSave() throws Exception {

    TransactionTemplate tt = new TransactionTemplate(transactionManager);
    tt.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus ts) {
            try {
                ApplicationParameter appPara = null;
                List<ApplicationParameter> appParaList = genericService.getListFromHQL("select o from ApplicationParameter as o order by o.id desc", false);
                if (appParaList != null) {
                    if (appParaList.size() > 0) {
                        appPara = (ApplicationParameter) appParaList.get(0);
                        appPara.setLastBankStatementMailNum(appPara.getLastBankStatementMailNum() + 10);

                        appPara = (ApplicationParameter) genericService.mergeObject(appPara);

                        System.out.println(" num is now = " + appPara.getLastBankStatementMailNum());
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();

            }
        }
    });

}