Ich habe zwei Quartz (1.8.3) Jobs, konfiguriert über Spring (2.5.6), einer von ihnen schreibt (send) in die Datenbank, und man liest davon (prüfen).Lesen/Schreiben von Quartz-Jobs in die Datenbank - Transaktionen funktionieren nicht
<bean id="scheduleFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="Check"/>
<ref bean="Send"/>
</list>
</property>
</bean>
<bean id="Send" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="StatusMonitor" />
<property name="targetMethod" value="sendMessage" />
</bean>
</property>
<property name="cronExpression" value="0 0/1 * * * ?" />
</bean>
<bean id="Check" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="StatusMonitor" />
<property name="targetMethod" value="checkAndUpdateStatus" />
</bean>
</property>
<property name="cronExpression" value="30 0/1 * * * ?" />
</bean>
Transaktionsmanager eingerichtet ist:
<tx:annotation-driven transaction-manager="TransactionManager"/>
In beiden Jobs, die ich in Transaktionen wie dies ausdrücklich lesen Run/Schreiboperationen:
@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) {
...
}
}
wo ew eine Transaction Bean ist, injiziert über den Frühling. Ich sehe "Status wurde aktualisiert" Datensatz in Protokollen, aber wenn ich diesen Datensatz von transaktionalen Lese-Methode gelesen, ist es manchmal veraltet. Außerdem, wenn ich einen SQL-Editor verwende, um diesen Datensatz zu lesen, ist es auch veraltet. Ich verstehe nicht, warum Transaktionen in diesem Fall nicht funktionieren, haben Sie irgendwelche Ideen? Danke.
Ist 'statusDAO' transactional (dh mit der @Transactionnal Annotation zum Beispiel)? –
Haben Sie dieses Problem immer noch? –
Wenn das Problem "manchmal" auftritt (aber die Protokollnachricht jedes Mal gedruckt wird), bedeutet dies höchstwahrscheinlich, dass Ihre Persistenzlogik fehlerhaft ist (JDBC oder Hibernate?). Überprüfen Sie den Inhalt der Funktion "doInTransactionWithoutResult" mit allen verschachtelten Aufrufen. Ich brauche mehr Code, um genauer zu sein. Wenn Sie ein minimales Testisolierungsproblem erstellen könnten, wird es helfen. –