我有一个调用MySQL存储过程的java程序,当它获得SQLEXCEPTION
时会回滚。当我将rollback(退出处理程序)添加到存储过程时,Java程序停止获取SQL异常。
如何确保将SQL异常和MySQL错误消息传播回Java程序?
这是我的商店程序:
DELIMITER $$
DROP PROCEDURE IF EXISTS up_OMS_insertParticipantOmsOrderOwner $$
CREATE PROCEDURE up_OMS_insertParticipantOmsOrderOwner(
IN PID int,
IN OwnerName varchar(50),
IN DisplayName varchar(50),
IN Enabled tinyint(1))
BEGIN
declare exit handler for SQLException
BEGIN
rollback;
END;
start transaction;
if (DisplayName<>'') then
insert OmsOrderOwner (ParticipantID, OmsOrderOwnerName, DisplayName, Enabled)
value (PID, OwnerName,DisplayName, Enabled);
else
insert OmsOrderOwner(ParticipantID, OmsOrderOwnerName, DisplayName, Enabled)
value (PID, OwnerName,null, Enabled);
end if;
set @OwnerID := @@identity;
insert UserOmsOrderOwnerSubscription (UserID, ParticipantID, OmsOrderOwnerID, Enabled)
select
userOrderSub.UserId, PID, @OwnerID, 1
from
Users u,
UserOmsOrderSubscription userOrderSub
where
userOrderSub.UserID = u.UserID and
u.ParticipantID = PID;
commit;
END $$
DELIMITER ;
答案 0 :(得分:2)
在退出处理程序中使用RESIGNAL语句重新抛出错误。
那就是说,真的你需要在你的存储过程中显式开始/提交/回滚事务吗? JDBC调用将(应该)在自己的事务中完成,你可以依靠它来处理错误/回滚并为自己省去一些麻烦吗?
答案 1 :(得分:0)
由于您在STP中处理了错误,因此它不再是例外。它应该只是您通话的正常返回状态。你应该从退出处理程序返回一些东西,比如
declare exit handler for SQLException
BEGIN
rollback;
select 1;
END;
start transaction;
1或其他什么是回滚的错误代码。
如果你仍然认为这是一个例外,你可以在MySQL 6.0中使用resignal。在早期版本中,您可以通过调用这样的非存在函数来触发错误,
call ROLLED_BACK_EXCEPTION();