ssh 框架中spring的事务控制

江巅 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,但是这里异常后事务就不会回滚。

引用
Spring中常用事务类型:

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

相关推荐