2012-03-14 1 views
0

내 데이터베이스에 2 개의 테이블이 있습니다. 아이템과 필드입니다. 항목은 트리를 구현하는 자체 참조 테이블입니다. Item 테이블에서 ID 및 ParentId 열이 있음을 의미합니다. 이 방법으로 Item 테이블에 트리를 저장할 수 있습니다. 필드는 항목의 다른 확장 속성을 저장하는 테이블입니다. 필드 테이블에는 항목 테이블을 참조하는 "Item_ID"라는 열이 있습니다.스냅 샷 격리 SQL Server 데이터베이스에서 트랜잭션 블록 삭제 작업을 업데이트해야하는 이유는 무엇입니까?

이제 데이터베이스 작업에 트랜잭션을 추가하기 만하면됩니다. 우리는 제목과 같은 이상한 행동을 발견했습니다. 마이크로 소프트는 질문으로

, 우리는 우리의 데이터베이스 스냅 숏 격리 사용하려면 다음 SQL을 실행

ALTER DATABASE AdventureWorks2008R2 
SET READ_COMMITTED_SNAPSHOT ON; 

ALTER DATABASE AdventureWorks2008R2 
SET ALLOW_SNAPSHOT_ISOLATION ON; 

을 그리고 우리는 다음과 같은 시험을 수행

  1. 열기 2 테스트 프로그램을

  2. 첫 번째 프로그램은 항목 1을 업데이트하고 트랜잭션이 커밋되기 전에 차단됩니다.

  3. 항목 2. 항목 1

  4. 2. 그런 다음 우리가 두 번째 발견 항목의 상위/하위는 항목 1이 없다는 것을 의미 항목 2의 관계형 선박이 없습니다 삭제하려고하는 두 번째 프로그램을 사용하여 프로그램이 첫 번째 프로그램에 의해 차단되었습니다. 우리가 첫 번째 프로그램을 계속한다면, 두 번째 프로그램은 시간 제한이 없으면 끝날 것입니다.

이 결과에 대해 이상하게 느껴집니다. Item 1조차도 거래가 이루어지기 때문에 Item 2를 삭제할 수 있다고 생각하기 때문입니다. 왜 이런 일이 일어나는 지 누가 압니까?

+1

정말 두 개의 레코드 사이에 직접적인 관계가없는 경우, 그것은 행 잠금이 아닌 잠금 테이블을 수행하는 데이터베이스 서버 같은 소리 . – gorjusborg

+0

@YuRDeD, 네가 맞다고 생각해. 부모/자식 관계 (그리고 나는 SQL Server의 잠금 전략의 내부를 알지 못한다는 것을 인정합니다.) 때문에 테이블 수준의 잠금을 수행해야합니다. –

+0

@Pleepleus 네, 저도 그렇게 생각합니다. 하지만 그렇게 할 필요는 없다고 생각합니다. 그리고 나는 해결책이 있는지를 알고 싶다. – Coofucoo

답변

0

스냅 샷을 전혀받지 못하는 것처럼 들리지만 (충돌/업데이트가 실패로 끝나고 결과적으로 완료되지 않아야하기 때문에)

문자 그대로 ALTER DATABASE AdventureWorks2008R2...을 실행하지 않았습니까?

"에서는 AdventureWorks2008R2는"데이터베이스의 이름으로 교체해야합니다으로

...

+0

예, 확실히 데이터베이스 이름을 바꿨습니다. 내 문제는 내 항목 테이블 자체 참조 테이블입니다 생각합니다. – Coofucoo