2017-01-13 3 views
0

Попытка понять транзакции ... Я использую Spring JdbcTemplate и @Transactional аннотацию в методе. Хотя транзакция активна во время выполнения метода (как указано в обоих журналах и TransactionSynchronizationManager.isActualTransactionActive()), автокоммит также, кажется, должен быть включен (как показано jdbcTemplate.getDataSource().getConnection().getAutoCommit())).autocommit = true во время весенней транзакции

Я не понимаю две вещи

  • Разве идея jdbc-транзакций не отключается автоматически и вручную завершается в конце кода? Неужели не работает менеджер весны, который должен делать что-то подобное под капотом?
  • Если автокоммит действительно включен: если один модификация базы данных преуспевает, а последующая неудача, как может откат назад предыдущих изменений (что он делает, d несмотря на стоимость автокомментариев)?
+1

Какие TransactionManager вы используете? Какой источник данных вы используете? Обратите внимание, что jdbcTemplate.getDataSource(). GetConnection() не вернет AFAIK, текущее соединение, а новое, которое не обрабатывается TransactionManager. Что происходит, когда вы вызываете getAutoCommit() на соединение, переданное обратным вызовам JdbcTemplate? –

+0

SimpleDriverDataSource и DataSourceTransactionManager. –

+0

Прочтите мой обновленный комментарий. –

ответ

1

Если обрабатывается doBegin() метод DataSourceTransactionManager, выполняется управление флагом.

https://docs.spring.io/spring/docs/2.5.x/javadoc-api/org/springframework/jdbc/datasource/DataSourceTransactionManager.html#doBegin(java.lang.Object,%20org.springframework.transaction.TransactionDefinition)

Если вы посмотрите на источники есть:

if (con.getAutoCommit()) { ... con.setAutoCommit(false); }

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