1.spring声明式事务并不能管理存储过程的事务,存储过程需要另外添加事务:
例如:存储过程捕获异常然后回滚:
create procedure inserttrabzsu()
begin
declare errno int default 0;
declare i int;
declare continue handler for sqlexception SET errno=1;
start transaction;
set i=0;
while i<10 do
insert 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;
}