最近学习spring声明式事务小结

本文探讨了在Spring框架中如何正确地使用事务管理来确保数据库操作的一致性。特别是在多个相关数据库更新操作中,如何配置Spring并调整代码以实现事务回滚。


在一些需要同时操作几个更新的业务逻辑中,而这几个更新又是互相关联的,也就是说我们希望它成功就一起成功,
失败就一起失败。这样我们就需要使用事务。关于如何配置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

则不需要跟配置文件异常相同,可以正常回滚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值