Index: MyWork/wildfly/ejb3/src/main/java/org/jboss/as/ejb3/timerservice/persistence/database/DatabaseTimerPersistence.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- MyWork/wildfly/ejb3/src/main/java/org/jboss/as/ejb3/timerservice/persistence/database/DatabaseTimerPersistence.java (date 1508813748000) +++ MyWork/wildfly/ejb3/src/main/java/org/jboss/as/ejb3/timerservice/persistence/database/DatabaseTimerPersistence.java (date 1522993721787) @@ -393,6 +393,7 @@ Connection connection = null; PreparedStatement statement = null; try { + tm.begin(); try { connection = dataSource.getConnection(); statement = connection.prepareStatement(loadTimer); @@ -408,9 +409,14 @@ } } catch (SQLException e) { // something wrong with the preparation + try { + tm.rollback(); + } catch (Exception ee){ + EjbLogger.EJB3_TIMER_LOGGER.timerUpdateFailedAndRollbackNotPossible(ee); + } throw new RuntimeException(e); } - tm.begin(); + int affected = statement.executeUpdate(); tm.commit(); return affected == 1; Index: MyWork/wildfly/ejb3/src/main/java/org/jboss/as/ejb3/timerservice/TimerServiceImpl.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- MyWork/wildfly/ejb3/src/main/java/org/jboss/as/ejb3/timerservice/TimerServiceImpl.java (date 1508813748000) +++ MyWork/wildfly/ejb3/src/main/java/org/jboss/as/ejb3/timerservice/TimerServiceImpl.java (date 1522993721756) @@ -604,10 +604,47 @@ EJB3_TIMER_LOGGER.timerPersistenceNotEnable(); return; } + + Transaction clientTX = transactionManager.getTransaction(); if (newTimer) { - timerPersistence.getValue().addTimer(timer); + if( clientTX == null ){ + transactionManager.begin(); + } + try { + timerPersistence.getValue().addTimer(timer); + if(clientTX == null) transactionManager.commit(); + } catch (Exception e){ + if(clientTX == null) { + try { + transactionManager.rollback(); + } catch (Exception ee){ + EjbLogger.EJB3_TIMER_LOGGER.timerUpdateFailedAndRollbackNotPossible(ee); + } + } + throw e; + } } else { - timerPersistence.getValue().persistTimer(timer); + if( clientTX != null ) transactionManager.suspend(); + for (int count = 3; count > 0; count--) { + try { + transactionManager.begin(); + timerPersistence.getValue().persistTimer(timer); + transactionManager.commit(); + break; + } catch (RuntimeException e) { + try { + transactionManager.rollback(); + } catch (Exception ee) { + // omit; + } + if (count > 1) { + EJB3_TIMER_LOGGER.debug("Failed to persist timer " + timer + " due to " + e.getCause()); + } else { + throw e; + } + } + } + if( clientTX != null ) transactionManager.resume(clientTX); } } catch (Throwable t) {