2009-09-17 4 views
1

나는 SQLEXCEPTION이되면 롤백되는 MySQL 저장 프로 시저를 호출하는 Java 프로그램을 가지고 있습니다. 저장 프로 시저에 롤백 (종료 핸들러)을 추가하면 Java 프로그램이 SQL 예외를 중지합니다.Java 프로그램에 MySQL 예외를 전파하는 방법은 무엇입니까?

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 ; 

답변

2

사용 RESIGNAL 문 :

여기에 내 가게의 절차입니다.

그런데 REALLY은 저장 프로 시저 내에서 트랜잭션을 명시 적으로 시작/커밋/롤백해야합니까? JDBC 호출은 어쨌든 자체 트랜잭션 내에서 수행되어야합니다. 대신 오류/롤백을 처리하고 스스로 문제를 해결할 수 있습니까?

+0

예, Java 코드에서 커밋 및 롤백을 이동할 수 있습니다. 불행히도 우리는 단기간에 그렇게 할 수 없습니다. 또한 불행한 점은 우리가 5.0x 버전의 MySQL을 사용하고있어서 사임 (resignal)이 작동하지 않는다는 것입니다. 내가 직접 signalFunct 쓸 수 있지만 나는 mysql 오류 메시지가 나타나지 않습니다. – richs

0

STP에서 오류를 처리 했으므로 더 이상 예외는 아닙니다. 통화의 정상적인 반환 상태 여야합니다.

declare exit handler for SQLException 
    BEGIN 
    rollback; 
    select 1; 
    END; 
start transaction; 

1 또는 롤백에 대한 오류 코드는 무엇이든 종료 핸들러에서 반환해야합니다.

여전히 예외라고 생각되는 경우, MySQL 6.0에서 resignal을 사용할 수 있습니다. 이전 버전에서는 다음과 같이 존재하지 않는 함수를 호출하여 오류를 트리거 할 수 있습니다.

call ROLLED_BACK_EXCEPTION(); 
+0

Resignal은 6.0이 아닌 5.4로 시작합니다. 실제로 존재하지 않는 함수를 호출하는 대신 위조 된 오류를 만드는 것은 여러 가지 이유로 이상적이지 못합니다. – ChssPly76

관련 문제