(NOLOCK)와 트랜잭션 격리 수준 설정 읽기가 커밋되지 않은 상태
제가 언제 사용해야 하는지에 대한 지침을 누가 주실 수 있나요?WITH (NOLOCK)
와는 반대로SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
각각의 장단점은 무엇입니까?다른 것과 반대로 하나를 사용하게 된 의도하지 않은 결과가 있습니까?
그것들은 같은 것입니다.를 사용하는 경우set transaction isolation level
문, 그것은 연결의 모든 테이블에 적용될 것이다, 그래서 만약 당신이 단지 원한다면.nolock
하나 또는 두 개의 테이블에서 그것을 사용하고, 그렇지 않으면 다른 테이블을 사용합니다.
둘 다 당신에게 더러운 읽을거리를 줄 것입니다.당신이 괜찮다면, 그것들을 사용하세요.더티 읽기를 할 수 없다면 고려해 보십시오.snapshot
또는serializable
대신 힌트를 줍니다.
WITH(NOLOCK)는 테이블 레벨의 힌트입니다.트랜잭션 분리 수준을 READ_로 설정하는 중연결에 영향을 주는 커밋되지 않았습니다.그 차이는 범위에 있습니다.SQL Server 설명서의 READ UNCOMMITED 및 NOLOCK을 참조하십시오.
http://technet.microsoft.com/en-us/library/ms187373.aspx
트랜잭션 분리 레벨: http://technet.microsoft.com/en-us/library/ms173763.aspx
- NOLOCK은 테이블(또는 뷰 등)에 로컬입니다.
- 세션/연결당 읽기가 커밋되지 않음
지침에 관해서는...StackOverflow와 전기 웹에서 무작위 검색...
내가 아는 한 유일한 차이점은 스트로미가 말한 것처럼 효과의 범위입니다.테이블에 잠금 힌트가 없고 세션에서 읽기가 커밋되지 않았습니다.
발생할 수 있는 문제는 일관성입니다.관심이 있는 경우 잘못된 정보로 조작되는 다른 데이터에 영향을 줄 수 있는 더티 읽기를 얻을 수 있습니다.
저는 개인적으로 이것으로부터 어떠한 문제도 보지 못했다고 생각하지만 그것은 제가 자물쇠를 사용하지 않는 방식 때문일 수도 있습니다.사용해도 괜찮은 시나리오가 있다는 것을 알아야 합니다.대부분 새 데이터를 테이블에 추가하지만 데이터 시나리오를 확인해야 하는 다른 프로세스가 있는 시나리오입니다.주요 흐름에는 읽기 중에 행으로 돌아가서 업데이트하는 작업이 포함되지 않으므로 괜찮을 것입니다.
또한 요즘에는 다중 버전 동시성 제어에 대해 알아봐야 한다고 생각합니다.저는 그들이 2005년에 그것을 추가했고 그것이 독자들에게 사용할 데이터베이스의 스냅샷을 제공함으로써 작가들이 독자들을 차단하는 것을 막는데 도움이 된다고 생각합니다.링크를 포함하고 독자에게 추가 연구를 남겨두겠습니다.
보기에서 트랜잭션 격리 수준 읽기 커밋되지 않음 설정을 사용할 수 없으므로(실제 보기에는 스크립트가 하나만 있을 수 있음) 더티 행을 포함해야 하는 경우에는 (잠금 없음)을 사용해야 합니다.
테이블마다 WITH(NOLOCK)를 사용해야 하기 때문에 FROM 또는 JOIN 절마다 작성하는 것이 번거로울 수 있습니다.하지만 그것이 "더러운" 읽기라고 불리는 이유가 있습니다.세션 범위의 기본값으로 설정해서는 안 됩니다. 그 이유는 무엇 때문입니다.
WITH(NOLOCK)를 잊어버리는 것은 프로그램에 매우 극적인 영향을 미치지 않을 수 있지만 원하지 않는 곳에서 더티 읽기를 수행하면 특정 상황에서 차이가 발생할 수 있습니다.
따라서 선택한 현재 데이터가 잘못될 경우 나중에 롤백될 수 있으므로 WITH(NOLOCK)를 사용합니다.이 기능은 대부분 성능을 향상시킬 때 사용되며, 애플리케이션 컨텍스트의 요구 사항에 따라 일관성 없는 데이터가 표시될 위험을 감수할 수 있습니다.그러나 WITH(NOLOCK)를 사용하기로 한 결정에 대해 귀하나 담당자가 찬반양론을 따져봐야 합니다.
언급URL : https://stackoverflow.com/questions/3550337/with-nolock-vs-set-transaction-isolation-level-read-uncommitted
'IT' 카테고리의 다른 글
C#의 목록에서 항목을 제거하는 방법은 무엇입니까? (0) | 2023.04.28 |
---|---|
"COM 클래스 공장에서 구성 요소를 검색하는 중...오류: 80070005 액세스가 거부되었습니다." (HRESULT: 0x80070005(E_ACCESSDENIED)) (0) | 2023.04.28 |
"0"과 "1"을 거짓과 참으로 변환하는 방법 (0) | 2023.04.28 |
deque 컨테이너와 list STL 컨테이너의 차이점은 무엇입니까? (0) | 2023.04.28 |
Excel용 EPLus 라이브러리로 다중 스타일 셀을 만들려면 어떻게 해야 합니까? (0) | 2023.04.28 |