首先事务不是spring独有的,这是数据库的标准,
事务:就是说好比你操作a,b,c三张表,操作了前2张表没问题,数据已经发生了改变,但是到第
三张表的时候出了问题,这时候你想撤销a,b2张表的操作,以保证数据的一致性,这时候就要用事务的回滚,
spring的事务回滚,当且仅当捕获到RuntimeException类型异常的时,才会出现回滚,对普通的 Exception异常无效
以下是我service层捕获异常,并抛出RuntimeException异常到Action层
public void lock(string id) throws RuntimeException{
try{
this.loginUserDao.lock(id);
LoginUser user=this.loginUserDao.findById(id);
user.setSex("捕获到异常,抛出RuntimeException类型异常");
this,loginUserDao.save(user);
}catch(Exception e){
throw new RuntimeException(e.getMessage());
}
}
spring中的配置
- <!-- 为sessionFactory定义事务管理器 -->
- <bean id="transactionManager"
- class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory">
- <ref local="sessionFactory" />
- </property>
- </bean>
- <!-- 定义事务拦截器 -->
- <bean id="transactionInterceptor"
- class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <!-- 为事务拦截器注入一个事务管理器 -->
- <property name="transactionManager" ref="transactionManager" />
- <property name="transactionAttributes">
- <!-- 定义事务传播属性 PROPAGATION_REQUIRED:表示如果事务不存在,则创建一个新事务,如果存在,则加入到该事务。 -->
- <props>
- <prop key="save*">PROPAGATION_REQUIRED</prop>
- <prop key="add*">PROPAGATION_REQUIRED</prop>
- <prop key="delete*">PROPAGATION_REQUIRED</prop>
- <prop key="update*">PROPAGATION_REQUIRED</prop>
- <prop key="lock*">PROPAGATION_REQUIRED</prop>
- <prop key="unLock*">PROPAGATION_REQUIRED</prop>
- <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
- </props>
- </property>