在一些需要同時(shí)操作幾個(gè)更新的業(yè)務(wù)邏輯中,而這幾個(gè)更新又是互相關(guān)聯(lián)的,也就是說(shuō)我們希望它成功就一起成功,
失敗就一起失敗。這樣我們就需要使用事務(wù)。關(guān)于如何配置spring聲明式事務(wù)就不說(shuō)了,需要的人可以在網(wǎng)上找下,
肯定會(huì)配置一個(gè)類似下面的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();
}
注意我故意在程序中放了一個(gè)會(huì)報(bào)異常的代碼Integer.valueOf("e")
測(cè)試結(jié)果是沒有成功,前一句已經(jīng)在數(shù)據(jù)庫(kù)里了。
后來(lái)修改spring的配置文件
<props>
<prop key="insert*">
PROPAGATION_REQUIRED,-Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
測(cè)試結(jié)果還是沒有成功,前一句已經(jīng)在數(shù)據(jù)庫(kù)里了。
所以大家以后在使用的時(shí)候就要注意了,正確的方式是在catch中顯式拋出你在配置文件聲明的異常
將上面的catch修改成為
catch(Exception e){
e.printStackTrace();
throw new Exception("回滾");
}
這樣就可以回滾上面的更新操作了
需要注意的是拋出的異常必須跟配置文件中的異常一致,否則不能回滾,或者經(jīng)過(guò)我測(cè)試,也可以
拋出
UnsupportedOperationException
則不需要跟配置文件異常相同,可以正常回滾。