2014-10-22 3 views
0

У меня проблема при тестировании JTA1.2 @Transactiona l аннотация на сервере приложений Glassfish 4.1. Если я запускаю выполнить() метод данного компонента:@ Транзакционная транзакция не откат

 

@Named 
@RequestScoped 
public class IndexController { 

    @Resource(name = "ds") 
    private DataSource ds; 

    @Transactional 
    public void execute() throws SQLException, SystemException { 
     try (Connection con = ds.getConnection();) { 
      try (PreparedStatement ps = con.prepareStatement(
        "INSERT INTO test(id) VALUES(1)" 
      );) { 
       ps.executeUpdate(); 
       throw new IllegalArgumentException(); 
      } 
     } 
    } 
} 
 

Я получаю ожидаемую ошибку:

Caused by: javax.transaction.RollbackException: Transaction marked for rollback. 

но когда я выполняю оператор выбора:

SELECT * FROM test; 

Я вижу, что строка была вставлено. Что не так?

+0

Вы проверили это? http://stackoverflow.com/questions/16301315/spring-transactional-and-jdbc-autocommit – Multisync

ответ

0

Какой БД вы используете и в каком режиме это? Может быть, я этого не вижу, но где вы делаете откат? Таким образом, запись будет временно записана в БД до тех пор, пока вы не откажетесь. Попробуйте следующее:

@Transactional(rollbackOn={Exception.class}) 

И нормально в блоке catch вы вызовете метод отката. Поскольку транзакция отмечена только для того, чтобы ее отбросить назад, и вы ответите на ее возврат.

+0

Всегда старайтесь добавить соответствующий код в свои ответы вместо того, чтобы просто указывать ссылки и ссылки. Это будет намного более полезно для человека, задающего вопрос. – Stewartside

Смежные вопросы