Spec-Zone .ru
спецификации, руководства, описания, API

21.3.13.2. Транзакционный Доступ JDBC

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

Чтобы использовать транзакционный доступ к базе данных, мы должны будем изменить механизм хранения таблиц в мировой базе данных. Загруженный сценарий явно составляет таблицы 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 pointcut.

<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.