@Transactional не откатывать транзакцию

У меня возникла проблема при тестировании аннотации JTA1.2 @Transactional на сервере приложений Glassfish 4.1. Если я запускаю метод execute() этого bean-компонента:


@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;

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


person Sergey Vinichenko    schedule 22.10.2014    source источник
comment
Вы проверили это? stackoverflow.com/questions/16301315/   -  person Multisync    schedule 22.10.2014


Ответы (1)


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

@Transactional(rollbackOn={Exception.class})

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

person aw-think    schedule 22.10.2014
comment
Всегда старайтесь добавлять соответствующий код в свои ответы, а не просто давать ссылки и ссылки. Это будет гораздо полезнее для человека, задающего вопрос. - person Stewartside; 22.10.2014