[SQL] EXECUTE 후 트랜잭션 개수가 일치하지 않는 BEGIN 및 COMMIT 문을 수를 나타냅니다. 이전 카운트 = 1, 현재 카운트 = 0
SQLEXECUTE 후 트랜잭션 개수가 일치하지 않는 BEGIN 및 COMMIT 문을 수를 나타냅니다. 이전 카운트 = 1, 현재 카운트 = 0
나는 표에 데이터를 공급하고 표에서 열 1의 값을 얻을과 표 2를 공급합니다 번째 저장 프로 시저를 호출 할 것이다 삽입 저장 프로 시저가 있습니다.
하지만이 같은 두 번째 저장 프로 시저를 호출 할 때 :
Exec USPStoredProcName
나는 다음과 같은 오류가 발생합니다 :
본인은 이러한 질문에 대한 답변을 읽고는 카운트가 엉망지고 커밋 정확한 위치를 찾을 수없는 생각했다.
해결법
-
==============================
1.당신이 try / catch 블록이있는 경우 그 원인은 예외 중단 트랜잭션을 잡기 계속된다는 것입니다. CATCH 블록에서 당신은 항상 XACT_STATE () 및 중단 핸들 적절하고 uncommitable (운명) 트랜잭션을 확인해야합니다. 발신자가 트랜잭션과 캬 히트를 시작하면, 말, (트랜잭션을 중단) 교착 상태가 어떻게 호출자가 트랜잭션이 중단 한 것을 호출자에게 전달하는 것입니다 그것은 '평소와 같이 사업'을 계속하지 않겠습니까? 유일하게 가능한 방법은 상황을 처리하기 위해 호출을 강제로 재 인상에 예외입니다. 당신이 자동으로 중단 된 트랜잭션을 삼켜 호출자가 원래 트랜잭션에 여전히 가정 지속될 경우에만 신체 상해는 보장 할 수 있습니다 (그리고 당신이 얻을 오류는 엔진 시도 자체를 보호하는 방법입니다).
당신이 try / catch 블록이있는 경우 그 원인은 예외 중단 트랜잭션을 잡기 계속된다는 것입니다. CATCH 블록에서 당신은 항상 XACT_STATE () 및 중단 핸들 적절하고 uncommitable (운명) 트랜잭션을 확인해야합니다. 발신자가 트랜잭션과 캬 히트를 시작하면, 말, (트랜잭션을 중단) 교착 상태가 어떻게 호출자가 트랜잭션이 중단 한 것을 호출자에게 전달하는 것입니다 그것은 '평소와 같이 사업'을 계속하지 않겠습니까? 유일하게 가능한 방법은 상황을 처리하기 위해 호출을 강제로 재 인상에 예외입니다. 당신이 자동으로 중단 된 트랜잭션을 삼켜 호출자가 원래 트랜잭션에 여전히 가정 지속될 경우에만 신체 상해는 보장 할 수 있습니다 (그리고 당신이 얻을 오류는 엔진 시도 자체를 보호하는 방법입니다).
난 당신이 예외 처리와 쇼 중첩 된 트랜잭션과 예외와 함께 사용할 수있는 패턴을 중첩 된 트랜잭션을 가서 추천 :
create procedure [usp_my_procedure_name] as begin set nocount on; declare @trancount int; set @trancount = @@trancount; begin try if @trancount = 0 begin transaction else save transaction usp_my_procedure_name; -- Do the actual work here lbexit: if @trancount = 0 commit; end try begin catch declare @error int, @message varchar(4000), @xstate int; select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE(); if @xstate = -1 rollback; if @xstate = 1 and @trancount = 0 rollback if @xstate = 1 and @trancount > 0 rollback transaction usp_my_procedure_name; raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ; end catch end go
-
==============================
2.나도이 문제를 가지고 있었다. 나를 위해, 그 이유는 내가 뭐하고 있었이었다
나도이 문제를 가지고 있었다. 나를 위해, 그 이유는 내가 뭐하고 있었이었다
return commit
대신에
commit return
하나의 저장 프로 시저입니다.
-
==============================
3.이것은 트랜잭션이 시작될 때 일반적으로 발생하고 어느 것이 최선을 다하고되지 않았거나 롤백되지 않습니다.
이것은 트랜잭션이 시작될 때 일반적으로 발생하고 어느 것이 최선을 다하고되지 않았거나 롤백되지 않습니다.
오류가 저장 프로 시저에 오는 경우 트랜잭션이 완료되지 않았기 때문에,이 때문에 예외 처리의 부재에서 일부 런타임 오류에 데이터베이스 테이블을 잠글 수 있습니다 당신은 아래와 같이 예외 처리를 사용할 수 있습니다. SET XACT_ABORT
SET XACT_ABORT ON SET NoCount ON Begin Try BEGIN TRANSACTION //Insert ,update queries COMMIT End Try Begin Catch ROLLBACK End Catch
출처
-
==============================
4.당신이 중첩 된 트랜잭션을 사용하는 경우, 롤백 작업 롤의 가장 바깥 일을 포함하여 모든 중첩 된 트랜잭션을 백업 할 것을 알고 있어야합니다.
당신이 중첩 된 트랜잭션을 사용하는 경우, 롤백 작업 롤의 가장 바깥 일을 포함하여 모든 중첩 된 트랜잭션을 백업 할 것을 알고 있어야합니다.
당신이 설명하는 오류에서 TRY / CATCH, 결과와 함께 사용이 힘. 자세한 내용은 여기를 참조하십시오.
-
==============================
5.저장 프로 시저가 트랜잭션 (예를 들어, 테이블을 찾을 수 없습니다, 잘못된 열 이름)를 연 후 컴파일 오류가 발생하는 경우가 발생할 수 있습니다.
저장 프로 시저가 트랜잭션 (예를 들어, 테이블을 찾을 수 없습니다, 잘못된 열 이름)를 연 후 컴파일 오류가 발생하는 경우가 발생할 수 있습니다.
난 내가 레무스 Rusanu에 의해 설명 된 것과 유사한 논리를 모두 잡을 / 2 저장 프로 시저는 "노동자"하나의 시도와 래퍼를 사용했다 발견했다. 작업자 캐치는 "정상"실패를 처리하는 데 사용되며, 래퍼 캐치 컴파일 실패 오류를 처리 할 수 있습니다.
https://msdn.microsoft.com/en-us/library/ms175976.aspx
시도 ... CATCH 구문에 의해 영향을받지 오류
희망이 디버깅 몇 시간 저장 다른 사람이 도움이 ...
-
==============================
6.저도 같은 오류 메시지가 있었다, 내 실수는 내가의 끝에 세미콜론을 한 것으로이었다 트랜잭션 라인을 COMMIT
저도 같은 오류 메시지가 있었다, 내 실수는 내가의 끝에 세미콜론을 한 것으로이었다 트랜잭션 라인을 COMMIT
-
==============================
7.(가) 트랜잭션을 BEGIN 안에 내 경우, 오류가 RETURN에 의해 발생되고 있었다. 그래서 내가 이런 일을했다 :
(가) 트랜잭션을 BEGIN 안에 내 경우, 오류가 RETURN에 의해 발생되고 있었다. 그래서 내가 이런 일을했다 :
Begin Transaction If (@something = 'foo') Begin --- do some stuff Return End commit
그것은 할 필요가 :
Begin Transaction If (@something = 'foo') Begin --- do some stuff Rollback Transaction ----- THIS WAS MISSING Return End commit
-
==============================
8.나는 한 번 내 거래에서이 문을 생략 한 후이 오류가 발생했습니다.
나는 한 번 내 거래에서이 문을 생략 한 후이 오류가 발생했습니다.
COMMIT TRANSACTION [MyTransactionName]
-
==============================
9.나를 위해 광범위한 디버깅 후 수정 던져 누락 간단한이었다; 롤백 후 캐치의 문. 그게 없으면이 추한 오류 메시지가 끝낼 것입니다.
나를 위해 광범위한 디버깅 후 수정 던져 누락 간단한이었다; 롤백 후 캐치의 문. 그게 없으면이 추한 오류 메시지가 끝낼 것입니다.
begin catch if @@trancount > 0 rollback transaction; throw; --allows capture of useful info when an exception happens within the transaction end catch
-
==============================
10.확실히 당신은 하나 더 미트되지 않은 남아 있습니다 그 중 동일한 절차 / 쿼리에 여러 트랜잭션이없는 있는지 확인하십시오.
확실히 당신은 하나 더 미트되지 않은 남아 있습니다 그 중 동일한 절차 / 쿼리에 여러 트랜잭션이없는 있는지 확인하십시오.
내 경우에는, 내가 실수로 쿼리에 TRAN 문을 BEGIN했다
-
==============================
11.이것은 또한 당신이 당신의 C # 코드에서 SP를 호출하는 방법에 따라 달라질 수 있습니다. SP에서 ExecuteStoreQuery와 SP 된 invoke 후 일부 테이블 형식의 값을 반환하고, SP가하는 경우하지 ExecuteStoreCommand와 SP 된 invoke 값을 반환하는 경우
이것은 또한 당신이 당신의 C # 코드에서 SP를 호출하는 방법에 따라 달라질 수 있습니다. SP에서 ExecuteStoreQuery와 SP 된 invoke 후 일부 테이블 형식의 값을 반환하고, SP가하는 경우하지 ExecuteStoreCommand와 SP 된 invoke 값을 반환하는 경우
-
==============================
12.내 의견으로는 허용 대답은 대부분의 경우에 과잉이다.
내 의견으로는 허용 대답은 대부분의 경우에 과잉이다.
오류의 원인은 종종 BEGIN의 불일치하고 명확 오류에 의해 언급 COMMIT. 사용이 수단 :
Begin Begin -- your query here End commit
대신에
Begin Transaction Begin -- your query here End commit
시작 후 트랜잭션을 생략하면이 오류가 발생합니다!
-
==============================
13.사용하지 마십시오
사용하지 마십시오
당신이 사용하는 문
과
SQL 저장 프로 시저의 문
-
==============================
14.당신은 같은의 코드 구조가있는 경우 :
당신은 같은의 코드 구조가있는 경우 :
SELECT 151 RETURN -151
그런 다음 사용 :
SELECT 151 ROLLBACK RETURN -151
from https://stackoverflow.com/questions/21930156/transaction-count-after-execute-indicates-a-mismatching-number-of-begin-and-comm by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] @@ IDENTITY, SCOPE_IDENTITY (), 출력 된 마지막 ID를 검색하는 다른 방법 (0) | 2020.04.18 |
---|---|
[SQL] 집계 함수없이 GROUP BY (0) | 2020.04.18 |
[SQL] SQL보기 : 전체 이름 필드에서, 첫 번째 중간 이름과 성을 구문 분석 (0) | 2020.04.18 |
[SQL] 어떻게 저장 프로 시저에서 여러 행을 반환? (오라클 PL / SQL) (0) | 2020.04.17 |
[SQL] JPQL IN 절 : 자바 배열 (또는 목록, 설정 ...)? (0) | 2020.04.17 |