您的位置:首页 > 编程语言 > Java开发

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

2016-06-22 15:42 501 查看
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;

}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: