江巅 2013-05-31
ssh框架中,通常我们的action会注入一个blo类,及服务层类,这个类里可以处理业务逻辑,执行多个dao的操作。
这个类是受spring事务控制的。例如以下代码,当我们请求addRoom.do的时候,就把页面输入的Room信息发到后台,从而达到插入数据库的操作。
但是这个操作如果在roomBlo里出现异常,即使插入数据库操作已完成,就会把事务回滚,从而自动取消刚刚完成数据库操作。注意这里配置的事务类型是PROPAGATION_REQUIRED
beans.xml
<bean name="/addRoom" lazy-init="true" class="action.AddRoomAction"> <property name="roomBlo"> <ref bean="roomBloProxy" /> </property> </bean> <bean id="roomBloProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref bean="myTransactionManager" /> </property> <property name="target"> <ref bean="roomBlo" /> </property> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="roomBlo" class="blo.RoomBlo"> <property name="roomDao"> <ref bean="room_hibernateDao" /> </property> </bean>
RoomBlo类我们这么写:
public class RoomBlo { ... public void addRoom(Room room) { roomDao.addRoom(room); throw new RuntimeException("dd"); } ... }
这个roomDao.addRoom(room)操作会在报出异常后回滚。
但是如果我们配置的事务类型是PROPAGATION_NOT_SUPPORTED,但是这里异常后事务就不会回滚。
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。