Отключение автоматической фиксации в NamedParameterJdbcTemplate.batchUpdate

Я делаю пакетное обновление в моей таблице БД, используя NamedParameterJdbcTemplate.batchUpdate, но я хотел бы отключить auto-commit и выполнить фиксацию вручную.

Я могу отключить режим автоматической фиксации для объекта connection, но не знаю, как сделать то же самое, используя объект NamedParameterJdbcTemplate.


person Shamim Hafiz    schedule 30.05.2013    source источник
comment
В любом случае, вы никогда не должны работать в режиме автоматической фиксации!   -  person Michael-O    schedule 05.06.2013


Ответы (2)


Я выполнил свою реализацию, используя TransactionTemplate

У него есть метод execute, и я выполняю бизнес-логику внутри обратного вызова в этой функции.

transTemplate.execute( new TransactionCallbackWithoutResult()
        {       
                @Override
                protected void doInTransactionWithoutResult( TransactionStatus status)
                {
                    status.setRollbackOnly();
                    //business logic
                }

        });
person Shamim Hafiz    schedule 04.06.2013

Я предполагаю, что вы знаете об управлении транзакциями в Spring, где, определяя @Transactional и передавая метаданные Propagation и Isolation, вы можете элегантно управлять транзакциями. Если нет, взгляните на документацию Spring. В большинстве случаев это все, что вам нужно.

Если вы хотите получить управление транзакциями своими руками и настроить его (т. е. выполнить фиксацию и откат по желанию), вам необходимо напрямую получить базовый TransactionManager.

Цитата из документов Spring:

Использование PlatformTransactionManager

Вы также можете напрямую использовать org.springframework.transaction.PlatformTransactionManager для управления транзакцией. Просто передайте реализацию PlatformTransactionManager, которую вы используете, в свой компонент через ссылку на компонент. Затем с помощью объектов TransactionDefinition и TransactionStatus можно инициировать транзакции, выполнять откат и фиксацию.

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

TransactionStatus status = txManager.getTransaction(def);
try {
  // execute your business logic here
}
catch (MyException ex) {
  txManager.rollback(status);
  throw ex;
}
txManager.commit(status);
person dimitrisli    schedule 30.05.2013
comment
Спасибо, только один быстрый отзыв, где определено TransactionDefinition? - person Shamim Hafiz; 30.05.2013
comment
Еще один вопрос: для бизнес-логики я собираюсь использовать NamedParameterJdbcTemplate, который использует тот же источник данных, который я использовал для создания DataSourceTransactionManager. Смогут ли они взаимодействовать друг с другом, то есть ссылаться на одно и то же соединение с БД? - person Shamim Hafiz; 30.05.2013
comment
Полные имена: org.springframework.transaction.TransactionDefinition и org.springframework.transaction.TransactionStatus. Если вы извлекаете зависимости с помощью Maven, это координаты зависимостей: › - person dimitrisli; 31.05.2013
comment
Именно это и есть: DataSourceTransactionManager. Все, что вам нужно сделать, это внедрить его в Bean-компонент, в котором вы должны выполнять эти операции. Под NamedParameterJdbcTemplate он также используется, и если вы внедрите его в свой компонент, вы получите контроль над ним и сможете использовать точно настроенные TransactionDefinition и TransactionStatus. - person dimitrisli; 31.05.2013
comment
Немного новичка и глупый вопрос на данном этапе: под инъекцией вы имеете в виду передачу в качестве параметра во время построения, как показано ниже? новый NamedParameterJdbcTemplate (источник данных); новый DataSourceTransactionManager (источник данных); - person Shamim Hafiz; 31.05.2013
comment
У меня такое ощущение, что тебе все это не нужно. @Transactional должно быть достаточно, если вы аннотируете свой метод службы, который вызывает ваш DAO, где ваш jdbcTemplate используется для ваших операций CRUD. Я бы посоветовал быстро прочитать документ: static.springsource.org/spring/docs/3.2.x/ и Google для примеров. - person dimitrisli; 31.05.2013