Spring事务使用
基于bean配置的事务
事务相关bean:
DataSourceTransactionManager
:JDBC 事务管理器,提供事务管理。
TransactionProxyFactoryBean
:事务管理相关的代理工厂类。
xml配置参考:
<!-- 配置druid数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root" />
<property name="password" value="root" />
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
</bean>
<!-- sql操作模板类-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- JDBC 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- DAO 层-->
<bean id="accountDao" class="com.bailiban.day6.beanxml.AccountDao">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- Service层-->
<bean id="accountService" class="com.bailiban.day6.beanxml.AccountService">
<property name="accountDao" ref="accountDao" />
</bean>
<!-- 动态代理-->
<bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!-- 指定事务管理器-->
<property name="transactionManager" ref="transactionManager" />
<!-- 指定代理对象-->
<property name="target" ref="accountService" />
<!-- 指定事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
示例代码见:https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day5/transaction/transfer/bean
基于拦截器的事务
相关bean:
- TransactionInterceptor: 事务拦截器;
- BeanNameAutoProxyCreator:自动生成代理,在前述AOP示例代码https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day4/aop/spring12/autoproxy 中,我们使用过该类;
xml配置参考:
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="serviceProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames" value="*Service" />
<property name="interceptorNames" value="transactionInterceptor" />
</bean>
示例代码见:https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day5/transaction/transfer/interceptor
基于tx标签的事务
相关标签:
<tx:advice>
:配置事务;- id:配置id;
- transaction-manager:指定事务管理器;
<tx:attributes>
:配置事务属性;<tx:method>
:对具体方法配置事务属性,Spring事务属性见下一小节;
- id:配置id;
xml配置参考:
<tx:advice id="transactionInterceptor" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:advisor advice-ref="transactionInterceptor" pointcut="execution(* com..bean.AccountService.*(..))" />
</aop:config>
示例代码见:https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day5/transaction/transfer/tx
基于注解的事务
相关注解:
- @Transactional:使用在类或者方法上,增加事务功能;
- @EnableTransactionManagement:开启事务管理;
示例代码见:https://github.com/Jun67/spring-demo/tree/master/src/main/java/com/bailiban/day5/transaction/transfer/annotation