저는 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에서 시작된다는 것을 알 수 있습니다.