2009-08-31 5 views
5

내가 읽은 기사 : http://www.codinghorror.com/blog/archives/001166.html http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htmSQL Server에서 잠금 전략을 변경하는 방법은 무엇입니까? 이와 같은

그리고 내가 이해에서, SQL 서버는 매우 비관적 잠금 전략을 가지고 . 그리고 성능을 향상시키기 위해 커밋 된 커밋 읽기 스냅 샷을 변경해야합니다.

하지만이 작업을 수행 할 위치를 찾을 수 없습니다. 어디에서 잠금 전략을 변경합니까?

답변

5

Using Row Versioning-based Isolation Levels에서 ALTER 명령을 사용하여 설정하는 방법에 대한 예제를 볼 수 있습니다. Row Versioning-based Isolation Levels in the Database Engine :

ALTER DATABASE YourDatabaseName SET READ_COMMITTED_SNAPSHOT ON; 

더 좋은 출발점이 관련 주제를 다룹 위 문서의 부모 인 다음과 같이

은 그것은 데이터베이스 수준에서 설정됩니다.

편집 : 내 의견에 언급 된 링크를 추가했습니다.

+0

그래, 그렇다면 현재 분리 수준을 어떻게 알 수 있습니까? 이 격리 수준은 트랜잭션에서 실행되는 쿼리 또는 모든 쿼리에만 적용됩니까? – Allrameest

+1

DBCC USEROPTIONS를 실행할 수 있으며 반환되는 항목 중 하나가 "격리 수준"의 현재 설정이됩니다. MSDN 링크는 다음과 같습니다. http://msdn.microsoft.com/ko-kr/library/ms180065aspx –

+0

질문의 두 번째 부분에 대해서는 트랜잭션에서 격리 수준을 사용하려면 "BEGIN TRAN"문 앞에 "SET TRANSACTION ISOLATION LEVEL SNAPSHOT"을 사용하여 특별히 설정해야합니다. 따라서 필자가 명시 적으로 선언 한 트랜잭션 쿼리에만 영향을 미친다는 것을 이해해야합니다. 위의 예는이 링크의 예입니다. 이것을 설명하는 좋은 기사도 여기에서 읽을 수 있습니다 : http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htm –

1

SNAPSHOT 격리 수준을 사용하면 데이터베이스로드가 증가함에 따라 tempdb에 많은로드가 추가됩니다.

잠금 방법 변경은 쿼리에서 잠금 힌트를 사용하거나 저장 프로 시저 또는 연결에 대한 ISOLATION LEVEL을 변경하여 수행하는 것이 가장 좋습니다. 이 작업은 SET ISOLATION LEVEL 명령을 사용하거나 .NET에서 연결 개체의 격리 수준을 변경하여 수행됩니다.

SQL Server가 기본 페이지 수준 (즉, 행 수준 잠금)이 아닌 다른 수준에서 잠금을 처리하도록하려면 SQL Server 내에서 WITH (ROWLOCK) 힌트를 사용하여 문 수준에서 문을 처리해야합니다 진술.

UPDATE YourTable (WITH ROWLOCK) 
    SET Col2 = 3 
WHERE Col1 = 'test' 

이이 잠금 레벨을 변경하는 전역 설정이 없으며, ROWLOCK 전체 페이지가로 여전히 페이지 수준에서 개최됩니다 스냅 샷 격리 수준 작업과 함께 사용되는 경우에 해제 복사 할 tempdb 데이터베이스가 업데이트 된 다음 tempdb 데이터베이스에서 이전 버전을 삭제해야합니다.

+0

-1 SET ISOLATION LEVEL을 통해 "READ_COMMITTED_SNAPSHOT"을 선택할 수 없습니다. 또는 .NET 연결 개체를 통해. Ahmad Mageed의 대답처럼 데이터베이스를 변경해야합니다. – Andomar

+0

@Andomar 예. SNAPSHOT을 사용하려면 데이터베이스 수준에서 활성화해야합니다. 트랜잭션을 사용하려면 트랜잭션의 격리 수준에 대해 SET TRANSACTION ISOLATION LEVEL SNAPSHOT을 사용하여 항상 기본값 인 READ COMMITTED 대신 SNAPSHOT을 사용해야합니다. – mrdenny

0

당신은 내가 우리가 설정 한 모든 연결에 대해이 작업을 수행 작동

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

를 호출하여 데이터베이스에 대한 연결을 설정할 때 잠금 격리 수준을 설정할 수 있습니다, 그들은 모두에 설정되어 데이터베이스에 액세스하기 위해 공유 연결 풀을 사용할 때와 같은 장소. READ UNCOMMITTED 옵션은 해당 연결에서 발행 한 모든 명령문에 적용됩니다.

+0

흠. 나는'READ UNCOMMITTED'를 전면적으로 설정하는 것을 권장하지 않습니다. 그것은 정말로 당신의 데이터베이스 사용에 달려 있습니다. SQL Server 2005+는 스냅 샷 격리를 지원하여 오라클의 작동 방식과 비슷한 방식으로 버전을 수정합니다. – pjp

+0

"커밋 된 읽기 스냅 샷"과 "커밋되지 않은 읽기"가 혼동 스럽습니다. 전자는 상대적으로 알려지지 않은 설정으로 "트랜잭션 격리 수준 설정"으로 선택할 수 없습니다. Ahmad Mageed의 글을 참고하십시오. – Andomar