事务,为什么你不回滚

 

明明在spring的配置文件里设置好了事务

但他出错后偏偏就是不回滚

现在我需要达到的效果是更新数据库中的多个表

分两步骤完成

1. 删除A 、B、 C表

2. 向A、B、C表添加新数据

若第二步出错,则需要回滚,撤销删除动作。

 

        最初为了抛出异常我在删除C表的时候故意操作一个不存在表,但结果并没有回滚A 、B表被无情删除;

网上查了下原因,原来是mysql表的属性设置引起的。
        默认下mysql表的stroage engine 属性是“MyISAM ”不支持事务,要修改为InnoDB。

修改后表属性后,在 删除C表出错时,删除A、B的操作会被回滚。

 

继续测试发现,在删除A 、B、 C表后,向A、B、新数据后立即通过 throw new Exception("")抛出一个异常,结果前面的动作会照常提交到数据库,没有回滚; 但如果我以运行int n=1/0的方式制造一个异常,则前面的删除动作就可以回滚了。

 非常纳闷,这究竟是什么原因呢?

 

以下是spring中关于事务的配置

  1. <import resource="dao-jdbc-config.xml" />
  2.     <bean id="transactionManager"
  3.         class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  4.         <property name="dataSource">
  5.             <ref bean="dataSource" />
  6.         </property>
  7.     </bean>
  8.     <bean id="transactionInterceptor"
  9.         class="org.springframework.transaction.interceptor.TransactionInterceptor">
  10.         <property name="transactionManager" ref="transactionManager" />
  11.         <property name="transactionAttributes">
  12.             <props>
  13.                 <prop key="*">PROPAGATION_REQUIRED</prop>
  14.                 <prop key="add*">PROPAGATION_REQUIRED</prop>
  15.                 <prop key="del*">PROPAGATION_REQUIRED</prop>
  16.                 <prop key="update*">PROPAGATION_REQUIRED</prop>
  17.                 <prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>
  18.                 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
  19.             </props>
  20.         </property>
  21.     </bean>
  22.     <bean
  23.         class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  24.         <property name="beanNames">
  25.             <value>*Service</value>
  26.         </property>
  27.         <property name="interceptorNames">
  28.             <list>
  29.                 <value>transactionInterceptor</value>
  30.                 <!--
  31.                     此处增加新的Interceptor
  32.                 -->
  33.             </list>
  34.         </property>
  35.     </bean>
  36.     <bean
  37.         class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
  38.         <property name="transactionInterceptor"
  39.             ref="transactionInterceptor" />
  40.     </bean>

在添上用svervice方法里面的操作

 

 

 

 

 

 

  1. public boolean uploadZipToDB(FormFile file, InputStream xmlIs, String localPath,String uploadType)
  2.                             throws Exception{ 
  3.         
  4.         boolean operateRs = true;
  5.         ArrayList adXmlbeanList= (ArrayList)ZipExtractor.getAdXmlbean(xmlIs);
  6.         Map imageFiles = getFileNameAndStrByFolder(file,"adui");
  7.         FileStrMap fileStrMap = new FileStrMap(imageFiles);
  8.         
  9. //      deleteAllAdModule(uploadType);
  10.         if(uploadType.equals("all")){
  11.             adpositionDao.deleteAllAdPosition();
  12.             adinfoDao.deleteAllAdinfo();
  13.             adimageDao.deleteAllAdimageinfo();
  14.             adPlayDao.deleteAlldplayinfo();
  15.             
  16.             moduleimageDao.deleteAllModuleImage();
  17.             adgroupDao.deleteAllAdGroup();
  18.             pageDao.deleteAllPageinfo();
  19.             moduleHtmDao.deleteAllModuleHtm();
  20.             uiFileDao.deleteAllUiFile();
  21.             groupLinkUiFileDao.deleteGroupLinkUiFile();
  22.         }
  23.         
  24.         
  25.         for(int i=0;i<adXmlbeanList.size();i++){
  26.             AdXmlbean adXmlbean = (AdXmlbean)adXmlbeanList.get(i);
  27.             String groupId = CommonsFiend.getUniqueId(10);
  28.             String imageId = CommonsFiend.getUniqueId(10);
  29.             String typeName = adXmlbean.getType();
  30.             Moduleimageinfo moduleimageinfo = createModuleimageinfo(fileStrMap,adXmlbean,imageId);
  31.             ModuleHtminfo moduleHtminfo =createModuleHtminfo(file,adXmlbean,groupId);
  32.             Adgroupinfo adgroupinfo = createAdgroupinfo(typeName,groupId,imageId);
  33.             //插入数据库
  34.             if(true){
  35.                  throw new Exception(""); //或 int  n= 1/0;
  36.             } 
  37.             operateRs = operateRs && isSucceed(moduleimageDao.addModuleImage(moduleimageinfo));
  38.             operateRs = operateRs && isSucceed(adgroupDao.addAdGroup(adgroupinfo));
  39.             operateRs = operateRs && isSucceed(moduleHtmDao.addModuleHtm(moduleHtminfo));
  40.             operateRs = operateRs && addAdpositioninfo2DB(adXmlbean,groupId);
  41.             operateRs = operateRs && addUifile2DB(file,adXmlbean,groupId);
  42.             operateRs = operateRs && creatImage4Preview(moduleimageinfo,localPath);
  43.         }
  44.         return operateRs;
  45.     }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值