<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="txManager" />
</property>
<!-- 配置事务属性 -->
<property name="transactionAttributes">
<props>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="create*">PROPAGATION_REQUIRED,-Exception</prop>
</props>
</property>
</bean>
<bean id="txProxy"
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>*Service</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
我个人理解:
在spring里配置事务,将事务的处理提至(推后)到service层进行处理,这样做的好处在于:dao层处理的只是单个的数据操作,而service业务层一般才是真正的有一个完整的操作,即事务。
(1)在上面的语句:<value>*Service</value> ,可以使所有以Service结尾的类使用事务拦截器,这些类中的不同方法使用不同的拦截策略。比如add开始的方法,使用策略:PROPAGATION_REQUIRED,-Exception,query开始的方法,使用策略:PROPAGATION_REQUIRED,readOnly。所以在query开头的方法中,不能调用增加、修改的方法。
例如:testService类中的queryPerson()方法中不能有下面的代码:
resultList=baseSalaryDao.querySalaryParams(baseNumber, start, limit);
if(resultList.size()==0){//如果数据库当中没有该基地日工资记录,则注入一条日工资为空的记录
BaseSalary baseSalary=new BaseSalary();
baseSalary.setBaseNumber(baseNumber);
baseSalaryDao.save(baseSalary);}//不能有保存的方法