Spec-Zone.ru › MySQL Connectors 1.0

15.2 Транзакционный доступ к JDBC

Spring позволяет добавлять транзакции в наш код без необходимости непосредственного взаимодействия с классами JDBC. Для этой цели Spring предоставляет пакет управления транзакциями, который не только заменяет управление транзакциями JDBC, но также позволяет декларативное управление транзакциями (настройка вместо кода).

Для использования транзакционного доступа к базе данных, нам нужно изменить движок хранения таблиц в базе данных world. Загруженный скрипт явно создает таблицы MyISAM, которые не поддерживают транзакционные семантики. Движок хранения InnoDB поддерживает транзакции, и именно его мы будем использовать. Мы можем изменить движок хранения следующими операторами.

ALTER TABLE City ENGINE=InnoDB;
ALTER TABLE Country ENGINE=InnoDB;
ALTER TABLE CountryLanguage ENGINE=InnoDB;

Хорошей программистской практикой, подчеркиваемой Spring, является разделение интерфейсов и реализаций. Это означает, что мы можем создать Java интерфейс и использовать только операции с этим интерфейсом без каких-либо внутренних знаний о фактической реализации. Мы позволим Spring управлять реализацией, и с этим он будет управлять транзакциями для нашей реализации.

Сначала создайте простой интерфейс:

public interface Ex3Dao {
    Integer createCity(String name, String countryCode,
    String district, Integer population);
}

Этот интерфейс содержит один метод, который создаст новую запись города в базе данных и вернет идентификатор новой записи. Затем вам необходимо создать реализацию этого интерфейса.

public class Ex3DaoImpl implements Ex3Dao {
    protected DataSource dataSource;
    protected SqlUpdate updateQuery;
    protected SqlFunction idQuery;

    public Integer createCity(String name, String countryCode,
        String district, Integer population) {
            updateQuery.update(new Object[] { name, countryCode,
                   district, population });
            return getLastId();
        }

    protected Integer getLastId() {
        return idQuery.run();
    }
}

Вы можете видеть, что мы работаем только с абстрактными объектами запросов и не имеем дело напрямую с API JDBC. Кроме того, это полная реализация. Все наше управление транзакциями будет обрабатываться в конфигурации. Чтобы начать конфигурацию, нам нужно создать DAO.

<bean id="dao" class="code.Ex3DaoImpl">
    <property name="dataSource" ref="dataSource"/>
    <property name="updateQuery">...</property>
    <property name="idQuery">...</property>
</bean>

Теперь нам нужно настроить конфигурацию транзакций. Первое, что мы должны сделать, это создать менеджер транзакций для управления источником данных и указать, какие свойства транзакций требуются для методов dao.

<bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

Предыдущий код создает менеджер транзакций, который обрабатывает транзакции для предоставленного ему источника данных. txAdvice использует этот менеджер транзакций, и атрибуты указывают на создание транзакции для всех методов. Наконец, нам нужно применить этот совет с помощью точки входа AOP.

<aop:config>
    <aop:pointcut id="daoMethods"
        expression="execution(* code.Ex3Dao.*(..))"/>
     <aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods"/>
</aop:config>

Это в основном означает, что все методы, вызываемые на интерфейсе Ex3Dao, будут обернуты в транзакцию. Чтобы воспользоваться этим, нам нужно только получить dao из контекста приложения и вызвать метод на экземпляре dao.

Ex3Dao dao = (Ex3Dao) ctx.getBean("dao");
Integer id = dao.createCity(name,  countryCode, district, pop);

Из этого мы можем убедиться, что в нашем Java-коде нет управления транзакциями, и все это настроено с помощью Spring. Это очень мощное понятие и считается одной из самых полезных функций Spring.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/connector-j-en/connector-j-usagenotes-spring-config-transactional.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API