web.xml文件中加载配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring.xml,
classpath:spring-hibernate.xml,
.............
classpath:spring-tasks.xml
</param-value>
</context-param>
spring-hibernate.xml文件一部分
<!-- 配置事务管理器 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
1.拦截服务
aop面向切面
<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* com.cares.*.service..*Impl.*(..))" />
<aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
</aop:config>
2.事务规则
拦截了add*方法的事务:
<!-- 拦截器方式配置事物 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" read-only="true" />
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="add*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.RuntimeException" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="test*" propagation="REQUIRED" />
<tx:method name="*Transaction" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
3.保证事务一致性
public void addTest() throws DeleteException, DataNotFoundException, CreateException {
testDAO.delete(testDAO.getById(1));//删除
Test test = new Test();
test.setDate(new Date());
testDAO.add(test);// 新增
}
方法名是add*可以被事务拦截到,而且(运行异常时)抛出异常让事务回滚,【事务的回滚一定得是运行异常】。编译类型异常不能产生回滚。
删除一个序号为1的test,并且新增一个test,但是新增的时候会报错,因为(表中)test还有一个字段的值是不能为空的。
test字段是不能为空,只给Date字段赋值,所以新增的时候肯定会产生创建失败异常(CreateException)。
4.实验结果
永远也删除不掉序号为1的test,因为新增产生异常,必然会回滚数据。