2011-04-21 5 views
0

저는 JDBC를 통해 여러 SQLServer2008 저장 프로 시저를 호출합니다.JDBC 트랜잭션이 유효한지 확인하는 방법이 있습니까?

모든 proc 호출을 동일한 트랜잭션의 일부로하고 싶습니다. PROC_1에서

con.setAutoCommit(false); 
boolean hasFailed = true; 

try 
{ 
    ... call PROC_1 

    ... call PROC_2 

    con.commit(); 
    hasFailed = false; 
} 
finally 
{ 
    if (hasFailed) 
    { 
    con.rollback(); 
    } 
    con.setAutoCommit(true); 
} 

내가 효과에는 트랜잭션이없는 경우에만 새 트랜잭션을 시작하는 트랜잭션 가드가 :

자바 측면에서 나는 다음에 해당이있다.

가드 내가 PROC_1를 입력 할 때 @@ TRANCOUNT가 여전히 0,

declare @owns_transaction int = 0 

begin try 

    if @@TRANCOUNT = 0 
    begin 
    begin transaction 
    set @owns_transaction = 1 
    end 

    ... do work 

    if @owns_transaction = 1 
    begin 
    commit transaction 
    set @owns_transaction = 0 
    end 
end try 
begin catch 
    if @owns_transaction = 1 
    begin 
    rollback transaction 
    set @owns_transaction = 0 
    end 
    ... handle error 
end catch 

그러나 @@ TRANCOUNT의 값을 선택하여 구현된다, 그래서 새 트랜잭션을 시작하고 나는 그것이 몇 가지가있을 수 있습니다 생각 나중에 무서운 결과.

XACT_STATE()를 사용하려고했지만 '현재 요청에 대한 활성 사용자 트랜잭션이 없습니다.'라는 결과도 반환됩니다.이 경우 수동 트랜잭션을 시작해야합니다. 게다가.

내가 잘못 했나요?

사실 나는 transaction 문에 이름을 추가하면 rollback에 이름이 트랜잭션을 롤백 할 수 없기 때문에 SQLServer가 트랜잭션에 있음을 알고 있다고 생각합니다. 이것은 TOP-LEVEL 트랜잭션이 PROC_1에서 시작되지 않았지만 실제로 JDBC에서 시작된다는 것을 알 수 있습니다.

답변

1

발견 방법. 당신이

con.setAutoCommit(false) 

는 그런 다음 @@ 옵션 기능의 도움으로 암시 적 트랜잭션 상태를 확인할 수 있습니다이

SET IMPLICIT_TRANSACTIONS ON; 

처럼 연결 IMPLICIT_TRANSACTIONS 옵션을 설정하는 것과 같습니다 호출 할 때

은 밝혀 :

if ((@@OPTIONS & 2) != 2) and (@@TRANCOUNT = 0) 
begin 
    select 'No transaction' 
end 
else begin 
    select 'Already in transaction' 
end 
관련 문제