在一些需要同时操作几个更新的业务逻辑中,而这几个更新又是互相关联的,也就是说我们希望它成功就一起成功,
失败就一起失败。这样我们就需要使用事务。关于如何配置spring声明式事务就不说了,需要的人可以在网上找下,
肯定会配置一个类似下面的bean
<bean id="cao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="target">
<ref bean="cao1"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
我在程序中使用的是spring的JdbcTemplate
try{
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("insert into NETFAXNO_TBL
(NETFAXNO,AREAID,PHONEAREA,CITYCODE,STATUS,lasttime,bnetid) values
('"+a1+"','"+a2+"','"+a3+"','"+a4+"','"+a5+"',getdate(),'"+a6+"' )");
jdbcTemplate.update("insert into NETFAXNO_TBL
(NETFAXNO,AREAID,PHONEAREA,CITYCODE,STATUS,lasttime,bnetid) values('"+a1+Integer.valueOf("e")
+"','"+a2+"','"+a3+"','"+a4+"','"+a5+"',getdate(),'"+a6+"' )");
a=true;
}catch(Exception e){
e.printStackTrace();
}
注意我故意在程序中放了一个会报异常的代码Integer.valueOf("e")
测试结果是没有成功,前一句已经在数据库里了。
后来修改spring的配置文件
<props>
<prop key="insert*">
PROPAGATION_REQUIRED,-Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
测试结果还是没有成功,前一句已经在数据库里了。
所以大家以后在使用的时候就要注意了,正确的方式是在catch中显式抛出你在配置文件声明的异常
将上面的catch修改成为
catch(Exception e){
e.printStackTrace();
throw new Exception("回滚");
}
这样就可以回滚上面的更新操作了
需要注意的是抛出的异常必须跟配置文件中的异常一致,否则不能回滚,或者经过我测试,也可以
抛出
UnsupportedOperationException
则不需要跟配置文件异常相同,可以正常回滚。