在上一节中<spring与MyBatis整合>,是没有配置事务的,这节将事务加入.
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务通知属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 事务传播属性 -->
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="login*" propagation="NEVER"/>
</tx:attributes>
</tx:advice>
<!-- 事务切面 -->
<aop:config>
<aop:pointcut id="serviceOperation"
expression="execution(* com.skymr.mybatis.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
</aop:config>
UserDao加入添加方法
package com.skymr.mybatis.dao;
import com.skymr.mybatis.model.User;
public interface UserDao {
public User login(String userName, String password);
public void saveUser(User user);
}
有些问题无法理解:
1)不添加事务管理时,或者将save*方法的传播属性改为NEVER后,还是能在表中添加数据,我觉得应该是不能添加数据才对。我记得在spring与hibernate集成时,不加事务是不能添加的.话说前几节中单独应用mybatis时也没加入事务管理,但还是能添加数据,单独使用jdbc也是;
2)在传播属性为REQURED的方法中调用传播属性为NEVER的方法,我以为会报错的,但结果没有,为什么呢?
我是这样理解的:required是需要在事务中运行,而never是不能在事务中运行,两种属性的方法放在一起调用,应该会出错的啊。
不能理解时就死记硬背吧。
3)在spring与hibernate集成中,查询是不加事务的,对查询方法配置NEVER属性,或去掉这个方法的属性配置,而使用getCurrentSession()取得session进行查询,会报出“找不到Session”的异常,需要将getCurrentSession()改为openSession()。
使用这种切面方式来实现事务管理有问题,发布后随着时间推移,访问速率会变得缓慢,应该使用《spring与Hibernate整合》那一节中使用事务的方式(事务代理工厂)
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务特性 ,使用时加载,抽象类 -->
<bean id="transactionBean"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
lazy-init="true"
abstract="true">
<property name="transactionManager" ref="transactionManager"></property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="get*">PROPAGATION_NEVER</prop>
<prop key="login*">PROPAGATION_NEVER</prop>
</props>
</property>
</bean>
<bean id="userServiceBase" class="com.skymr.mybatis.service.impl.UserServiceBean"/>
<!-- -->
<bean id="userService" parent="transactionBean">
<property name="target" ref="userServiceBase"></property>
</bean>
去掉UserServiceBean的自动扫描的注解(@Service("userService")),由spring容器配置.
这种方式管理事务比较好。