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

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;
		
	}
	






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值