[SQL] "이 SqlTransaction이 완료되었습니다; 더 이상 사용할 수 없습니다. "... 구성 오류?
SQL"이 SqlTransaction이 완료되었습니다; 더 이상 사용할 수 없습니다. "... 구성 오류?
지금은 하루 반에 대해이 작업을하고 numberous 블로그와 웹에서 도움말을 검색했습니다. 그래서이 오류에 관한 여러 질문을 찾았지만, 내가 (또는 경우에 따라, 불행하게도, 나는 충분히 잘 구현하는 방법을 이해할 수 없었다 : P)가 아주 내 상황에 적용 생각하지 않았다. 나는 확실히 내가 간다 여기에 도움이 충분히 설명 ...하지만 수 아니에요 :
우리는 우리의 자원을 추적 할 수있는 .NET 응용 프로그램을 가지고있다. 시간 추적 시스템과 결제 시스템에 자원을 복사하는 내보내기 기능이있다; 이 저장 프로 시저에 액세스 시간 및 결제 데이터베이스에 대한 링크가.
나는 최근에 새 서버로 과금 시스템 데이터베이스 이동 (원래 서버 : 서버 2003 SP2, SQL 2005, 새로운 서버 : 서버 2008 R2, SQL 2008 R2). 나는 2008 데이터베이스에 그 지점까지 연결된 서버 세트가 있습니다. 나는 2008 서버를 가리 키도록 저장 프로 시저를 업데이트 한 다음 나는 MSDTC 및 RPC (http://www.safnet.com/writing/tech/archives/2007/06/server_myserver.html)에 대한 오류를 얻었다. 나는 연결된 서버에 'RPC / RPC 아웃'을 사용하고 네트워크 액세스를 (이 같은 : http://www.sqlwebpedia.com/content/msdtc-troubleshooting)을 허용하도록 MSDTC를 설정합니다.
"이 SqlTransaction 완료 없다, 그것은 더 이상 사용할 수 있습니다."지금은 내보내기 기능을 실행하려고 할 때, 위군요 무엇이 나에게 이상한 것 같다 것은 그냥 (SSMS에서) 저장 프로 시저를 실행할 때, 그것이 성공적으로 완료 말한다는 것이다.
사람이 전에 본 적이 있습니까? 나는 구성에서 뭔가를 놓친 적이 있습니까? 저도 같은 페이지에 걸쳐 계속하고, 내가 찾은 유일한 것은 내가 재부팅 여기에 언급 된 MSDTC 변경 (한 후하지 않았다이었다 : http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders / 스레드 / 7172223f-acbe-4472-8cdf-feec80fd2e64 /).
나는 그것이 도움이 될 경우 ... 알려 주시기 바랍니다, 일부 또는 저장 프로 시저를 모두 게시 할 수 있습니다.
해결법
-
==============================
1.이 오류 메시지는 "좀비 거래"때문이다 믿습니다.
이 오류 메시지는 "좀비 거래"때문이다 믿습니다.
transacton가 (등 또는 롤백 회 또는 롤백 커미트) 회 커밋 될 수 영역을 찾는다. SP가 이미 저지른 후 닷넷 코드는 트랜잭션을 커밋합니까? 이 오류가 발생한 다시 닷넷 코드 롤, 다음 캐치 (또는 마지막) 절에서 다시 그것을 롤하려고합니까?
이 오류 조건이 결코 기존 서버에 박히는되지 않았다 가능하고, 따라서 결함 "을 두 번 롤백"코드가 맞았 적이 있습니다. 어쩌면 지금 당신은 예외 처리를 통해 일부 구성 새 서버에 오류가, 지금은 결함이있는 코드가 점점 인기가있는 상황이있다.
당신은 오류 코드에 디버깅 할 수 있습니까? 당신은 스택 추적을 가지고 있습니까?
-
==============================
2.나는 최근에 새로운 연결 관리자에서 리팩토링 후이 있었다. 새로운 루틴, 그것은 배치의 일부로 실행 될 수 있도록 트랜잭션을 허용 문제는 사용하여 블록을했다 :
나는 최근에 새로운 연결 관리자에서 리팩토링 후이 있었다. 새로운 루틴, 그것은 배치의 일부로 실행 될 수 있도록 트랜잭션을 허용 문제는 사용하여 블록을했다 :
public IEnumerable<T> Query<T>(IDbTransaction transaction, string command, dynamic param = null) { using (transaction.Connection) { using (transaction) { return transaction.Connection.Query<T>(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure); } } }
그것은 본다 마치 따라서 트랜잭션 (transaction)를 위탁 또는 메시지를 던졌다 롤백하려는 시도 기본 연결을 종료하고 사용하여 외부 "이 SqlTransaction이 완료 없다,. 더 이상 사용할 수를"
나는 커버하는 테스트를 추가 using이 제거하고 문제가 멀리 갔다.
public IEnumerable<T> Query<T>(IDbTransaction transaction, string command, dynamic param = null) { return transaction.Connection.Query<T>(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure); }
트랜잭션의 컨텍스트 내부에있는 동안 연결을 종료 할 수있는 것을 확인합니다.
-
==============================
3.나는 최근에 비슷한 상황 가로 질러왔다. 어떤 VS IDE 버전에서 디버깅하려면, 디버그 (Ctrl 키 + D, E)에서 열린 예외 - 열 "슬로우"에 대한 모든 체크 박스를 확인하고 디버그 모드에서 응용 프로그램을 실행합니다. 나는 테이블 중 하나가 새 데이터베이스에서 제대로 가져 오지 것을 실현, 그래서 내부는 SQL 예외가 연결을 죽이는, 따라서이 오류로 발생합니다.
나는 최근에 비슷한 상황 가로 질러왔다. 어떤 VS IDE 버전에서 디버깅하려면, 디버그 (Ctrl 키 + D, E)에서 열린 예외 - 열 "슬로우"에 대한 모든 체크 박스를 확인하고 디버그 모드에서 응용 프로그램을 실행합니다. 나는 테이블 중 하나가 새 데이터베이스에서 제대로 가져 오지 것을 실현, 그래서 내부는 SQL 예외가 연결을 죽이는, 따라서이 오류로 발생합니다.
이전 코드를 작업하는 새로운 데이터베이스에서이 오류를 반환하면 이야기의 요점은,이, 디버깅 팁 위가 데이터베이스 스키마없는 문제, 실현 될 수있다
희망이, 도움 HydTechie
-
==============================
4.나도 같은 문제가있어. 이 오류는 conection에 풀링 때문에 발생합니다. 시스템 ACESS 둘 이상의 사용자 connetion와 너무 transation 재사용 풀링 connetion 존재합니다. 첫 번째 사용자가 커밋 실행하면 OU는 트랜잭션이 더 조마를 사용할 수 없습니다 롤백.
나도 같은 문제가있어. 이 오류는 conection에 풀링 때문에 발생합니다. 시스템 ACESS 둘 이상의 사용자 connetion와 너무 transation 재사용 풀링 connetion 존재합니다. 첫 번째 사용자가 커밋 실행하면 OU는 트랜잭션이 더 조마를 사용할 수 없습니다 롤백.
-
==============================
5.내 경우에는 문제가 트랜잭션에 포함 된 쿼리의 하나가 예외를 발생되고, 예외가 "우아하게"처리에도 불구하고, 여전히 전체 트랜잭션을 롤백하는 데 성공했다.
내 경우에는 문제가 트랜잭션에 포함 된 쿼리의 하나가 예외를 발생되고, 예외가 "우아하게"처리에도 불구하고, 여전히 전체 트랜잭션을 롤백하는 데 성공했다.
내 의사 코드는 같았다 :
var transaction = connection.BeginTransaction(); for(all the lines in a file) { try{ InsertLineInTable(); // INSERT statement might fail and throw an exception } catch { // notify the user about the error on line x and continue } } // Commit and Rollback will fail if one of the queries // in InsertLineInTable threw an exception if(CheckTableForErrors()) { transaction.Commit(); } else { transaction.Rollback(); }
-
==============================
6.또한 DB에 대한 사용자의 .NET 응용 프로그램에서 실행되는 모든 장기 실행 프로세스를 점검하십시오. 예를 들어, 당신은 당신의 로그와 같은에 표시 할 수있는 완료하는 데 충분한 시간이없는 저장 프로 시저 또는 쿼리를 호출 할 수있다 :
또한 DB에 대한 사용자의 .NET 응용 프로그램에서 실행되는 모든 장기 실행 프로세스를 점검하십시오. 예를 들어, 당신은 당신의 로그와 같은에 표시 할 수있는 완료하는 데 충분한 시간이없는 저장 프로 시저 또는 쿼리를 호출 할 수있다 :
명령 제한 시간 설정을 확인 추적 (프로파일)을 실행하고 DB 측에서 무슨 일이 일어나고 있는지 보려고 ...
-
==============================
7.내 경우, 나는 코드의 같은 시도 캐치 block.One 줬어요에서 트랜잭션을 커밋 한 후 실행해야 몇 가지 코드를했습니다 오류는 트랜잭션 롤백을 포함 그것의 catch 블록에 오류 넘겨 블록을 시도합니다. 그것은 유사한 오류가 표시됩니다. 아래의 코드 구조의 예를 들어보기 위해 :
내 경우, 나는 코드의 같은 시도 캐치 block.One 줬어요에서 트랜잭션을 커밋 한 후 실행해야 몇 가지 코드를했습니다 오류는 트랜잭션 롤백을 포함 그것의 catch 블록에 오류 넘겨 블록을 시도합니다. 그것은 유사한 오류가 표시됩니다. 아래의 코드 구조의 예를 들어보기 위해 :
SqlTransaction trans = null; try{ trans = Con.BeginTransaction(); // your codes trans.Commit(); //your codes having errors } catch(Exception ex) { trans.Rollback(); //transaction roll back // error message } finally { // connection close }
누군가 바랍니다 :)
-
==============================
8.여기에 좀비 트랜잭션을 감지 할 수있는 방법이다
여기에 좀비 트랜잭션을 감지 할 수있는 방법이다
SqlTransaction trans = connection.BeginTransaction(); //some db calls here if (trans.Connection != null) //Detecting zombie transaction { trans.Commit(); }
SqlTransaction 클래스를 디 컴파일하여 다음을 볼 수
public SqlConnection Connection { get { if (this.IsZombied) return (SqlConnection) null; return this._connection; } }
나는 연결이 종료되면, transOP 따라서 커밋 할 수없는, 좀비가 될 것이다 알 수 있습니다. 나는이 finally 블록 내에서 () 커밋이 있기 때문에 연결이 try 블록에있는 동안 나의 경우, 그것은이다. 이러한 형태는 연결 배치되도록 가비지 수집 유발된다. 이 솔루션은 대신 try 블록 내에서 커밋 넣어했다.
from https://stackoverflow.com/questions/6358806/this-sqltransaction-has-completed-it-is-no-longer-usable-configuration-er by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 쿼리에서 기본 값을 반환하는 방법 (0) | 2020.06.30 |
---|---|
[SQL] 어떻게 열 이름 SqlDataReader.GetValue하여 데이터를 얻을 수 있습니다 (0) | 2020.06.30 |
[SQL] PostgreSQL의 열 'foo는'존재하지 않는 (0) | 2020.06.30 |
[SQL] 어떻게 LINQ와 SELECT UNIQUE을 할 수 있습니까? (0) | 2020.06.30 |
[SQL] 두 번 항목 회계에 대한 관계형 데이터 모델 (0) | 2020.06.30 |