트랜잭션에 랩핑 된 두 개의 저장 프로 시저가 있습니다. 여러 가지 이유 때문에 데이터베이스 내에서가 아니라 내 응용 프로그램 코드에서 트랜잭션을 처리해야합니다. 순간 SqlTransaction의 롤백에 대한 예외 처리
, 내 코드는 다음과 같습니다 저장된 발동 중 하나가 오류, 내가 좋아하는 모습을보고하고 예외 메시지 제기try
{
using (SqlConnection conn = Connection())
{
conn.Open();
using (SqlTransaction sqlTrans = conn.BeginTransaction())
{
try
{
using (SqlCommand cmd1 = new SqlCommand("Stored_Proc_1", conn, sqlTrans))
{
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.ExecuteNonQuery();
}
using (SqlCommand cmd2 = new SqlCommand("Stored_Proc_2", conn, sqlTrans))
{
cmd2.CommandType = CommandType.StoredProcedure;
cmd2.ExecuteNonQuery();
}
sqlTrans.Commit();
}
catch
{
sqlTrans.Rollback();
throw;
}
}
conn.Close();
}
}
catch (SqlException ex)
{
// exception handling and logging code here...
}
: 의미가
Error message from raiserror within stored procedure.
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0.
을 첫 번째 catch에서 트랜잭션이 아직 롤백되지 않았기 때문입니다.
하지만 트렌 카운트 메시지가 없는데 "은 트랜잭션을 롤백하기 때문에 예외 처리 코드로 인해 관심이 없습니다. 이것을 달성하기 위해 코드를 재구성 할 수있는 방법이 있습니까?
편집 : 내 저장 발동의 기본 구조는 다음과 같습니다
:
이create proc Stored_Proc_1
as
set nocount on
begin try
begin transaction
raiserror('Error raised by Stored_Proc_1', 16, 1)
commit
end try
begin catch
if (@@trancount > 0) rollback
declare @ErrMsg nvarchar(4000), @ErrSeverity int, @ErrProc sysname, @ErrLine varchar(10)
select @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY(), @ErrProc = ERROR_PROCEDURE(), @ErrLine = ERROR_LINE()
-- log the error
-- sql logging code here...
raiserror(@ErrMsg, @ErrSeverity, 1)
end catch
UPDATE : 내 저장 프로 시저에서 처리하는 트랜잭션을 수행하고 한 가 보인다 문제를 해결했다. 분명히 나는 그것을 잘못하고 있었다 - 그러나 나는 그것을 올바르게하는 방법을 아직도 알고 싶다. 저장 프로 시저에서 트랜잭션을 제거하는 것이 가장 좋은 솔루션입니까?
의견을 보내 주셔서 감사합니다. 저장된 procs가 잘못 작동했다고 생각하지 않습니다. 기본 구조를 포함하도록 질문을 업데이트했습니다. – kristian
잠깐, 나는 당신이 말하는 것을 보았다고 생각합니다. C# 코드는 트랜잭션이 존재할 것으로 기대하지만, SQL 코드는 그것을 되돌려 놓고 있습니다. – kristian
정확히 ... 라인 "if (@@ trancount> 0) rollback"은 공짜입니다 ... ** 그것이 ** 트랜잭션 ** 생성 여부를 추적하는 플래그를 설정해야합니다. 열린 거래. –