明明在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中关于事务的配置
- <import resource="dao-jdbc-config.xml" />
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- </bean>
- <bean id="transactionInterceptor"
- class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager" ref="transactionManager" />
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- <prop key="add*">PROPAGATION_REQUIRED</prop>
- <prop key="del*">PROPAGATION_REQUIRED</prop>
- <prop key="update*">PROPAGATION_REQUIRED</prop>
- <prop key="select*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
- </props>
- </property>
- </bean>
- <bean
- class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <value>*Service</value>
- </property>
- <property name="interceptorNames">
- <list>
- <value>transactionInterceptor</value>
- <!--
- 此处增加新的Interceptor
- -->
- </list>
- </property>
- </bean>
- <bean
- class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
- <property name="transactionInterceptor"
- ref="transactionInterceptor" />
- </bean>
在添上用svervice方法里面的操作
- public boolean uploadZipToDB(FormFile file, InputStream xmlIs, String localPath,String uploadType)
- throws Exception{
- boolean operateRs = true;
- ArrayList adXmlbeanList= (ArrayList)ZipExtractor.getAdXmlbean(xmlIs);
- Map imageFiles = getFileNameAndStrByFolder(file,"adui");
- FileStrMap fileStrMap = new FileStrMap(imageFiles);
- // deleteAllAdModule(uploadType);
- if(uploadType.equals("all")){
- adpositionDao.deleteAllAdPosition();
- adinfoDao.deleteAllAdinfo();
- adimageDao.deleteAllAdimageinfo();
- adPlayDao.deleteAlldplayinfo();
- moduleimageDao.deleteAllModuleImage();
- adgroupDao.deleteAllAdGroup();
- pageDao.deleteAllPageinfo();
- moduleHtmDao.deleteAllModuleHtm();
- uiFileDao.deleteAllUiFile();
- groupLinkUiFileDao.deleteGroupLinkUiFile();
- }
- for(int i=0;i<adXmlbeanList.size();i++){
- AdXmlbean adXmlbean = (AdXmlbean)adXmlbeanList.get(i);
- String groupId = CommonsFiend.getUniqueId(10);
- String imageId = CommonsFiend.getUniqueId(10);
- String typeName = adXmlbean.getType();
- Moduleimageinfo moduleimageinfo = createModuleimageinfo(fileStrMap,adXmlbean,imageId);
- ModuleHtminfo moduleHtminfo =createModuleHtminfo(file,adXmlbean,groupId);
- Adgroupinfo adgroupinfo = createAdgroupinfo(typeName,groupId,imageId);
- //插入数据库
- if(true){
- throw new Exception(""); //或 int n= 1/0;
- }
- operateRs = operateRs && isSucceed(moduleimageDao.addModuleImage(moduleimageinfo));
- operateRs = operateRs && isSucceed(adgroupDao.addAdGroup(adgroupinfo));
- operateRs = operateRs && isSucceed(moduleHtmDao.addModuleHtm(moduleHtminfo));
- operateRs = operateRs && addAdpositioninfo2DB(adXmlbean,groupId);
- operateRs = operateRs && addUifile2DB(file,adXmlbean,groupId);
- operateRs = operateRs && creatImage4Preview(moduleimageinfo,localPath);
- }
- return operateRs;
- }