Проверка того, что все вызовы JDBC происходят внутри транзакции - PullRequest
3 голосов
/ 06 августа 2009

Как я могу проверить, что весь доступ JDBC происходит в активной транзакции, , т.е. java.sql.Connection.getAutoCommit() всегда возвращать false?

Я использую Spring для управления транзакциями (@Transactional) и Hibernate для доступа к данным.


Обновление : происходит то, что некоторый доступ к Hibernate выполняется без пометки метода сервиса с помощью @Transactional. Об этом я и хочу получать уведомления.

Обновление 2 : пример кода

Можно позвонить по следующему коду:

public ServiceImpl implements Service {

     // missing @Transactional
     public List<String> getSomeIds() {
           return getDao().getSomeIds();
     }
}

Ответы [ 3 ]

2 голосов
/ 06 августа 2009

Один из способов, который я могу придумать, - это реализовать и зарегистрировать фиктивный драйвер JDBC, который будет действовать как перехватчик между операторами, которые вы хотите отслеживать, а также вести журнал, когда Connection # setAutoCommit () и Connection # commit () вызывается, чтобы узнать границы сделки.

2 голосов
/ 06 августа 2009

Используйте PROPAGATION_REQUIRED на всех постоянных методах.

1 голос
/ 06 августа 2009

На самом деле вам не нужно это делать, поскольку согласно документации @Transactional , раздел 9.5.6.1:

Настройки @Transactional по умолчанию:

 The propagation setting is PROPAGATION_REQUIRED
 ....

PROPAGATION_REQUIRED означает:

Поддержите текущую транзакцию, создайте новую, если ее нет.

РЕДАКТИРОВАТЬ: Лучше всего делать то, что сказал @duffymo в своем комментарии:

Вы можете написать аспект, который явно запрещает доступ DAO за пределы уровня обслуживания, если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...