Spec-Zone .ru
спецификации, руководства, описания, API
|
Вы могли бы задаваться вопросом, как мы можем добавить транзакции в наш код, если мы не имеем дело непосредственно с классами 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.