简单说一下,在serviceA.method1()中开启编程式事务,method1()中调用ApplicationLogicB的method2()方法,method2()方法中调用了deleteC()方法和insertD()方法,在deleteC()中删除了某主键唯一标示的数据库中记录,然后在insertD()中插入该主键的数据库记录,现在用try catch将对insertD()的调用围绕起来,捕捉异常,然后根据异常的类型和错误信息。若为由于数据生僻字导致的异常,则在catch中修正数据,然后重新执行insertD()方法。问题来了,重新执行insertD()方法时,总报出重复主键错误。期待对此问题有了结的朋友帮忙。serviceA{method1(){//启动编程式事务try{method1();}catch(Exception e){//失败,回滚}//成功,提交}method1(){applicationLogicB.method2();}}Application LogicB{method2(){deleteC();try{insertD();}catch(Exception e){//判断异常类型if(e.getInitCause().XXX && e.getMessage().contains("xxxx"){//修正插入数据中的错误数据,然后重新插入。在这里报出了重复主键错误!insertD();}else{throw e;}}}deleteC(){//删除数据库中某记录}insertD(){插入数据库中某记录}}

解决方案 »

  1.   

    事务不能捕获吧?必须抛出异常才能回滚,你可以先抛出异常,在外面一层捕获异常然后再调method2之类的...
      

  2.   

    在你try中插入数据虽然报异常了,但是他有没有可能已经插入了,只是数据不全?如果是这样你再次插入主键肯定冲突啊。你可以多写个查询语句,在catch里面先查询是否有刚刚插入的那条记录,然后再判断是否需要删除刚刚插入的记录。