2016-01-28 5 views
1

Я работаю с весной jdbcTemplate в некоторых приложениях на рабочем столе.Начало и откат транзакций с помощью JdbcTemplate

Я пытаюсь откат некоторых операций с базой данных, но я не знаю, как я могу управлять транзакцией с этим объектом (JdbcTemplate). Я делаю несколько вложений и обновлений через последовательность методов. Когда какая-либо операция не выполняется, мне нужно отменить все предыдущие операции.

любая идея?


Обновлено ... Я попытался использовать @Transactional, но откат назад не происходит.

Нужна ли мне предыдущая конфигурация на моем JdbcTemplate?

Мой пример:

@Transactional(rollingbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW) 
    public void Testing(){ 
    jdbcTemplate.exec("Insert into table Acess_Level(IdLevel,Description) values(1,'Admin')"); 
    jdbcTemplate.exec("Insert into table Acess_Level(IdLevel,Description) values(STRING,'Admin')"); 
    } 

IdLevel числовой параметр, так что ... в нашей второй команды будет происходить исключение. Когда я вижу таблицу в базе данных, я вижу первую вставку ... но, я думаю, эта операция должна быть откат.

что не так?

+0

Только похлопывая аннотацию, там не будет работать. Аннотация - это просто метаданные, не добавляя ничего, что знает, как обрабатывать эту аннотацию, она ничего не делает. Вам нужно добавить '@ EnableTransactionManagement' в ваш класс конфигурации или' 'в xml. Также имейте в виду, что только вызовы внешних методов будут транзакционными, если вы вызываете метод «Тестирование» из того же класса, что он не будет транзакционным. –

ответ

2

JdbcTemplate не обрабатывает транзакции самостоятельно. Вы должны использовать аннотации TransactionTemplate или @Transactional: при этом вы можете группировать операции внутри транзакции и откатывать все операции в случае ошибок.

@Transactional 
public void someMethod() { 
    jdbcTemplate.update(..) 
} 
+0

Большая часть примеров, которые я нашел, показывает нам, как откат при возникновении исключения. В любом случае существует ли возможность вручную совершать транзакции с помощью JdbcTemplate? я думаю, будет проще. –

2

Весной частные методы не проксируются, поэтому аннотация не будет работать. См. Этот вопрос: Does Spring @Transactional attribute work on a private method?.

Создайте сервис и поместите @Transactional на общедоступные методы, которые вы хотите быть транзакционными. Было бы более нормально выглядящим кодом Spring иметь простые объекты DAO, каждый из которых выполняет одно задание и должен иметь несколько из них, но он должен иметь сложный объект DAO, который выполнял несколько вызовов SQL в рамках своей собственной транзакции.

+0

Извините ... я написал пример неверным способом. Я использую публичные методы в реальном, но безуспешно. –

+0

@Cleiton: без подробностей я могу сказать, выберите пример из весенних образцов и попытайтесь подражать ему. Похоже, вы пытаетесь использовать ярлыки для уменьшения количества задействованных объектов. но трудно сказать без лишнего кода. –

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