spring管理下的声明式事务与存储过程之间的记录

来源:互联网 发布:js触发select选择事件 编辑:程序博客网 时间:2024/06/05 23:59

1.spring声明式事务并不能管理存储过程的事务,存储过程需要另外添加事务:


例如:存储过程捕获异常然后回滚:

create procedure inserttrabzsu()begindeclare errno int default 0;declare i int;declare continue handler for sqlexception SET errno=1;start transaction;set i=0;while i<10 doinsert into news (click,content) values(45,"sdsgdsf");set i=i+1;end while;IF errno = 1 THEN  ROLLBACK;  ELSE  COMMIT;  END IF;  select errno;end;


我的想法是外部写着普通的sql语句,然后混合了存储过程,存储过程中如果有错,则回滚,且返回给外部一个值,根据这个值来决定是否主动抛出异常,让外部的sql语句也能回滚。但是最终的结果会有个bug:

存储过程中的语句出现错误,会回滚,然后返回给外部一个值,根据此值,让外部主动进入异常throw new Exception("MyException");按道理来讲,外部也将回滚,但是发现回滚了多条,始终第一条无法回滚。因此:一般情况下还是不要混合使用,要么直接使用多条sql语句和程序完成任务,要么就写一个存储过程。


附上测试代码:

public boolean insertnewtratwo() throws Exception{News news=new News();for(int i=0;i<15;i++){news.setClick(20);news.setContent("sqlcharu");this.em.persist(news);}String a=this.em.createNativeQuery("{call inserttrabzsu()}").getSingleResult().toString();if(a.equals("1")){ throw new Exception("MyException");    }System.out.println(a);int aa=5/0;return true;}






0 0