2013-04-30 1 views
6

В моем реальном приложении у меня есть пул соединений DBCP, который не имеет JDBC autoCommit = false set. Кажется, у него есть autoCommit = true. Возможно, это ошибка, но я хотел бы понять влияние изменения этого параметра.Spring @Transactional и JDBC autoCommit

Я использую: - Spring с @Transactional аннотаций - Spring Batch с читателями JDBC и писателей, в конце концов пользовательских тасклетами с использованием JdbcTemplate

Я хотел бы знать, если Spring действительно установлен Autocommit = ложь о текущем подключении если он находится в контексте транзакции, обрабатываемой TransactionManager. Отменяет ли это значение по умолчанию? Потому что мне кажется, что это имеет смысл.

+0

Да, это так. Spring управляет им для вас с классом реализации аннотации. – duffymo

+0

спасибо, но ты мог бы ответить вместо комментария :) –

+2

Не волнуй. Все здесь - эксперт. Когда я даю ответ, у меня есть люди, которые говорят мне, что это должен быть комментарий. Я комментирую, и вы говорите мне, что это должен быть ответ. Какая разница? Иногда у меня есть время ответить, иногда я этого не делаю. – duffymo

ответ

8

PlatformTransactionManager - это интерфейс, поэтому я бы не сказал, что все реализации устанавливают AutoCommit = false, однако наиболее распространенная реализация (DataSourceTransactionManager) устанавливает AutoCommit = false. см ниже фрагмент кода из метода doBegin:

if (con.getAutoCommit()) { 
      txObject.setMustRestoreAutoCommit(true); 
      if (logger.isDebugEnabled()) { 
       logger.debug("Switching JDBC Connection [" + con + "] to manual commit"); 
      } 
      con.setAutoCommit(false); 
     } 
     txObject.getConnectionHolder().setTransactionActive(true); 

Теперь, как вы заявили, это имеет смысл делать это или не будет иметь сегмент отката, чтобы активировать откат на.

+0

спасибо за доказательство :) –