У меня есть метод «databaseChanges», который вызывает итерации 2 операций: A, B. Сначала «A», «B» - последний. 'А' & 'B' может быть С reate, U бновить D далить функциональные возможности в моем постоянном хранении, база данных Oracle 11g.Откат назад, если B идет не так. spring boot, jdbctemplate
Скажем,
'A' обновить запись в таблице пользователей, атрибут почтового индекса, где ID = 1.
'B' вставить запись в таблицы хобби.
Сценарий: Метод базы данных вызван, «A» работает и обновляет запись. «B» работает и пытается вставить запись, что-то случилось, генерируется исключение, исключение кипит к методу databaseChanges.
Ожидаемое: «A» и «B» ничего не меняли. обновление, которое было сделано «A», будет откатом. «Б» ничего не изменил, ну ... было исключение.
Актуально: Обновление 'A', похоже, не откат. «Б» ничего не изменил, ну ... было исключение.
Некоторые Код
Если я имел связи, я хотел бы сделать что-то вроде:
private void databaseChanges(Connection conn) {
try {
conn.setAutoCommit(false);
A(); //update.
B(); //insert
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception ei) {
//logs...
}
} finally {
conn.setAutoCommit(true);
}
}
Проблема: У меня нет подключения (см Tags что сообщение с вопросом)
Я пытался:
@Service
public class SomeService implements ISomeService {
@Autowired
private NamedParameterJdbcTemplate jdbcTemplate;
@Autowired
private NamedParameterJdbcTemplate npjt;
@Transactional
private void databaseChanges() throws Exception {
A(); //update.
B(); //insert
}
}
Мой AppConfig класс:
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
@Configuration
public class AppConfig {
@Autowired
private DataSource dataSource;
@Bean
public NamedParameterJdbcTemplate namedParameterJdbcTemplate() {
return new NamedParameterJdbcTemplate(dataSource);
}
}
'A' делает обновление. из «B» выбрано исключение. Обновление, которое было сделано «A», не откат.
Из того, что я читал, я понимаю, что я не использую @Transactional правильно. Я прочитал и пробовал несколько сообщений в блогах и stackverflow Q & A без успеха для решения моей проблемы.
Любые предложения?
EDIT
Существует метод, который называют databaseChanges() метод
public void changes() throws Exception {
someLogicBefore();
databaseChanges();
someLogicAfter();
}
Какой метод должен быть аннотированный с @Transactional,
изменения()? databaseChanges()?
Постараюсь, спасибо! – lolo
не работает. Обновление не откат – lolo
Вы вводите класс (в моем примере MyFacade), правильно? В противном случае атрибут не будет соблюден. Возможно, вы можете создать очень простой пример и опубликовать все классы. Тогда легче понять, что еще не так. – Guenther