내 데이터베이스에 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;
을 그리고 우리는 다음과 같은 시험을 수행
열기 2 테스트 프로그램을
첫 번째 프로그램은 항목 1을 업데이트하고 트랜잭션이 커밋되기 전에 차단됩니다.
항목 2. 항목 1
2. 그런 다음 우리가 두 번째 발견 항목의 상위/하위는 항목 1이 없다는 것을 의미 항목 2의 관계형 선박이 없습니다 삭제하려고하는 두 번째 프로그램을 사용하여 프로그램이 첫 번째 프로그램에 의해 차단되었습니다. 우리가 첫 번째 프로그램을 계속한다면, 두 번째 프로그램은 시간 제한이 없으면 끝날 것입니다.
이 결과에 대해 이상하게 느껴집니다. Item 1조차도 거래가 이루어지기 때문에 Item 2를 삭제할 수 있다고 생각하기 때문입니다. 왜 이런 일이 일어나는 지 누가 압니까?
정말 두 개의 레코드 사이에 직접적인 관계가없는 경우, 그것은 행 잠금이 아닌 잠금 테이블을 수행하는 데이터베이스 서버 같은 소리 . – gorjusborg
@YuRDeD, 네가 맞다고 생각해. 부모/자식 관계 (그리고 나는 SQL Server의 잠금 전략의 내부를 알지 못한다는 것을 인정합니다.) 때문에 테이블 수준의 잠금을 수행해야합니다. –
@Pleepleus 네, 저도 그렇게 생각합니다. 하지만 그렇게 할 필요는 없다고 생각합니다. 그리고 나는 해결책이 있는지를 알고 싶다. – Coofucoo