2009-06-28 6 views
1

SQL Server에서 이상한 문제가 발생했습니다. 웹 서비스에 연결하여 차례로 데이터베이스에 연결하고 많은 양의 데이터를 삽입하는 포켓 PC 응용 프로그램이 있습니다. 웹 서비스는 연결된 포켓 PC마다 트랜잭션을 엽니 다. 매일 오후 12시에 서로 다른 포켓 PC를 사용하는 15 명에서 20 명이 웹 서비스에 동시에 연결되어 성공적으로 전송을 완료합니다. 그러나 그 후에 4000 독점 잠금과 관련된 하나의 열린 트랜잭션 (활동 모니터에 표시됨)이 남아 있습니다. 몇 시간 후에 사라지며 (아마도 무언가 타임 아웃) 전송 된 데이터 중 일부가 삭제됩니다. 이러한 잠금이 발생하는 것을 막을 수있는 방법이 있습니까? 또는 프로그래밍 방식으로 인식하고 잠금 해제를 기다리시겠습니까?트랜잭션 커밋이 성공적으로 실행되었지만 수행되지 않음

고마워요.

답변

0

많은 테스트를 수행하면서 교착 상태가 발생하는 것으로 나타났습니다. 그러나 나는 독립된 테이블에 너무 많은 레코드를 삽입하기 때문에 이유를 찾을 수 없습니다. 이러한 링크는 조금 도움이,하지만 행운에 :

http://support.microsoft.com/kb/323630

http://support.microsoft.com/kb/162361

나는 심지어 작은 것들에 내 거래를 부러졌지만, 여전히 교착 상태를 얻었다.마지막으로 트랜잭션을 제거하고 원본 데이터베이스에서 코드를 삭제하지 않도록 코드를 변경했으며 더 이상 교착 상태가 발생하지 않았습니다.

한 번에 같은 데이터베이스에서 많은 트랜잭션이 두 번 실행되는 경우에는 SQL Server에 문제가있는 것으로 알고 있습니다. Oracle에 대해서는 잘 모릅니다. .

1

SQL Server Profiler을 사용하면 트랜잭션의 시작과 끝을 포함하여 발생하는 명령문을 모니터 할 수 있습니다. 또한 Microsoft Support의 일부 도구는 프로파일 러 및 차단 스크립트를 실행 한 이후로 훌륭합니다. 나는 내가/할 경우 업데이 트를 찾을 수 있는지보고 싶습니다.

열린 트랜잭션이있는 경우 활동 모니터에서이를 볼 수 있어야하므로 서버를 다시 시작하기 전에 열려있는 트랜잭션이 있는지 확인할 수 있습니다. 이 문제가 매일 대략 같은 시간을 일처럼

편집

소리가 난다. 문제가 발생하기 전에 전원을 켜기를 원할 것입니다.

+0

감사합니다. 그러나 프로파일 러는 트랜잭션이 시작된 후에 추적이 시작될 때 어떤 활동도 표시하지 않습니다. – reticent

+0

정확히. 오늘 아침 추적을 시작했는데, 이상한 걸 찾아 보거나 자물쇠에 대한 걸 찾아 냈어. 내가 확인해야 할게있어? – reticent

0

코드에 뭔가 이상한 점을 알았습니까? 명령 시간 제한을 커다란 값으로 설정했거나 커밋을 건너 뛰는 오류가 있습니까? 당신은 실행하여 열려있는 어떤 거래를 검사 할 수 있습니다

:.

DBCC OPENTRAN 
+0

커맨드 타임 아웃을 변경하지 않았고 커밋이 실행되었다고 확신합니다. (한 번에 3 개의 트랜잭션이 커밋되기 때문에 하나는 MySql에, 다른 하나는 SqlServer에, 다른 하나는 커밋되고 다른 트랜잭션은 커밋됩니다. 데이터 참조). DBCC OPENTRAN은 커밋 된 후 열린 트랜잭션을 표시합니다. 나는 그것을하기 위해 지금 무엇을해야할지 모른다. – reticent

+0

코드를 여기에 게시 할 수있을만큼 작게자를 수 있습니까? –

+0

// 모든 메소드는 SqlCE 트랜잭션 내부의 장치 프로젝트에서 호출되는 webservice에 의해 호출됩니다. public DataService() { mySqlService = new mySqlService(); 연결 = 새 SqlConnection (연결 문자열); connection.Open(); transaction = connection.BeginTransaction(); } ... // 방법은 데이터를 전송하는 - 그들은 이 공공 무효가)() ( { transaction.Commit 커밋 트랜잭션을 사용; mySqlService.Commit(); connection.Close(); } 공개 무효 롤백() { transaction.Rollback(); mySqlService.Rollback(); } – reticent

2

당신은 sp_lock을 실행하고 관심있는 테이블에 개최 배타적 잠금이 있는지 확인할 수 있습니다 그것은 당신에게 SPID을 말할 것이다 를 입력하고 sp_who 또는 sp_who2을 사용하여 해당 SPID에 대한 자세한 정보를 찾을 수 있습니다.

또는 Management Studio의 Activity Monitor에서이 정보의 그래픽 버전을 제공하고 불쾌한 프로세스를 종료 할 수도 있습니다. kill 명령을 사용하면 쿼리 편집기에서 동일한 작업을 수행 할 수 있습니다.

+0

감사합니다. 다시 일어날 때까지 기다려야했습니다. 활성 모니터가 보여 주듯이 프로세스와 관련된 열린 트랜잭션이 있습니다. 그리고 sp_lock을 사용하면이 SPID에 대해 약 7000 개의 잠금이 있음을 알 수 있습니다. 비정상인가요? 그렇다면 어떻게 그것을 막을 수 있습니까? 아니면이 거래를 커밋 할 수있는 방법이 있습니까? 왜냐하면 그것을 죽이는 것이 내 문제에 관한 선택이 아니기 때문이다. 다시 한번 감사드립니다. – reticent

+0

꽤 많은 수의 잠금 장치가 있습니다! 당신이 바라는 것들은 기본 리소스에 대한 모든 액세스를 차단하기 때문에 X로 표시된 배타적 잠금입니다. (IX, 의도 잠금, 상위 오브젝트에 대한 잠금을 얻는 다른 사용자의 중지,이 프로세스에 행에 X 잠금이있는 경우 해당 행을 포함하는 페이지 및 테이블은 IX 잠금). 욕심 많은 프로세스에 관해서는 sp_who2를보고 연결 지점과 응용 프로그램을 찾으십시오. 그건 디버그 도움이됩니다. 그런 다음 SQL 프로파일 러와 같은 다른 기술을 사용하여 디버깅을 미세 조정할 수 있습니다. –

+0

그 중 72 개가 IX이고 다른 모든 것이 X입니다. sp_who2에서 볼 수 있듯이 웹 서비스 사용자가오고 있으며 상태가 '잠자기'라고합니다. 나는 마지막으로 내 코드를 디버깅했으며 예외가 없다고 확신한다. 모든 삽입을 실행 한 후에 프로그래밍 방식으로 검사 할 수있는 정보가 있습니까? 이러한 잠금을 피하기 위해 어떤 방식 으로든 트랜잭션을 구성 할 수 있습니까? – reticent

0

선택시 제한 시간은 트랜잭션이 테이블의 적어도 일부만 잠금으로 열려 있음을 나타냅니다.

웹 서비스를 통한 거래는 어떻게하고 있습니까? 어떻게 당신의 코드에서 거래를 커밋하고 있습니까?

+0

System.Data.SqlClient를 사용하고 있습니다. 포켓 PC에 의해 호출되는 WebMethod가 있는데, 트랜잭션을 시작하고 데이터를 삽입하고 커밋합니다. 전체 메소드는 try/catch 블록에 있으며 예외가 발생하면 트랜잭션을 롤백합니다. 내가 너의 질문에 대답 했니? – reticent

+0

죄송합니다. 내가 틀렸어. MyGeneration.doodads (저는 SqlCe 데이터베이스에 .NET 공급자를 사용합니다)를 사용하고 있습니다. doodads에는 트랜잭션을 처리하는 TransactionMgr이 있습니다. 나는 닷넷 SQL 공급자를 사용하기 위해 전체 코드를 변경했다. – reticent

관련 문제