Ладно, ребята.Я прочитал довольно много документов.И в конце концов я пойму, почему это происходит.
Как и многие другие люди, у нас есть служба, взаимодействующая с оракулом.Это довольно стандартная настройка
@Service
public class DaoService {
private JdbcTemplate jdbcTemplate;
private SimpleJdbcInsert insertA;
private SimpleJdbcInsert insertB;
private SimpleJdbcInsert insertC;
@Autowired
public Dao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
// Assume all Inserts are initialized
}
@Transactional(rollbackFor = Exception.class)
public void insertStuff(Stuff stuff) {
insertA.execute(stuff.A);
// Suppose a connection failed here
insertB.executeBatch(stuff.B);
insertC.executeBatch(stuff.C);
}
Теперь здесь кроется наша проблема.Для 99% откатов все в порядке.
Когда по неизвестным причинам соединение закрывается, возникают наши проблемы.Сообщение об исключении:
TransactionSystemException: Could not roll back JDBC transaction;
nested exception is java.sql.SQLException: "The connection is closed"
Видите, оно пытается выполнить откат, как положено.Но проблема в том, что штука A, задерживающаяся в БД, будет вещи B, а вещи C нет.Это происходит только как 1% времени.(ака, иногда, несмотря на ошибку отката, в DB не будет «мелочей».
Я понимаю, что-то не так? Я думал, что пружина фиксирует коммит только в конце успешной транзакции? У кого-нибудь есть идеи о том, какЯ могу остановить эти частичные коммиты, несмотря на то, что они делают в @Transactional?
ps за то, что это стоит. Автокоммит по умолчанию включен. Однако я читал, что это не учитывается, когда что-то @ Transactional