커밋되지 않은 읽기 격리 수준을 사용해야하는 이유는 무엇입니까?
평범한 영어로, 사용의 단점과 장점은 무엇입니까
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
NET 응용 프로그램 및보고 서비스 응용 프로그램에 대한 쿼리에서?
이 격리 수준은 더티 읽기를 허용합니다. 하나의 트랜잭션은 다른 트랜잭션에 의해 커밋되지 않은 변경 사항을 볼 수 있습니다.
최고 수준의 격리를 유지하기 위해 DBMS는 일반적으로 데이터에 대한 잠금을 획득하므로 동시성 손실과 높은 잠금 오버 헤드가 발생할 수 있습니다. 이 격리 수준은이 속성을 완화시킵니다.
몇 가지 예와 추가 정보 는 Wikipedia 기사READ UNCOMMITTED
를 확인하십시오 .
Jeff Atwood의 블로그 기사 에서 스택 오버플로 초기에 교착 상태 문제를 해결 한 방법에 대한 Jeff Atwood의 블로그 기사 를 확인하는 것이 좋습니다. Jeff에 따르면 :
그러나
nolock
위험합니까? 에 잘못된 데이터를 읽게 될 수read uncommitted
있습니까? 예, 이론 상으로는 ACID 과학을 떨어 뜨리기 시작한 데이터베이스 아키텍처 우주 비행사가 부족하다는 것을 발견 할 수 있습니다nolock
. 사실이다 : 이론은 무섭다. 그러나 여기 제가 생각하는 것은 "이론에는 이론과 실제에 차이가 없습니다. 실제로는 있습니다."나는
nolock
데이터베이스 교착 상태 문제에 대해 일반적인 "당신을 위해 좋은"뱀 기름 수정으로 사용 하는 것을 권장하지 않을 것입니다. 먼저 문제의 원인을 진단해야합니다.그러나 실제로
nolock
당신이 절대적으로 알고있는 쿼리를 추가 하는 것은 간단하고 간단한 읽기 전용 문제는 결코 문제를 일으키지 않는 것 같습니다 ... 당신이 무엇을하고 있는지 아는 한.
READ UNCOMMITTED
고려할 수 있는 수준 에 대한 한 가지 대안 은 READ COMMITTED SNAPSHOT
입니다. Jeff를 다시 인용 :
스냅 샷은 완전히 새로운 데이터 변경 추적 방법에 의존합니다. 약간의 논리적 변경보다 서버가 데이터를 물리적으로 다르게 처리해야합니다. 이 새로운 데이터 변경 추적 방법이 활성화되면 모든 데이터 변경의 복사본 또는 스냅 샷이 생성됩니다. 경합 발생시 라이브 데이터가 아닌 이러한 스냅 샷을 읽으면 더 이상 읽기에 공유 잠금이 필요하지 않으며 전체 데이터베이스 성능이 향상 될 수 있습니다.
이것은 긴 삽입 쿼리의 진행 상황을 COUNT(*)
보거나 대략 적인 추정 (예 : 또는 거친 SUM(*)
) 등을 만드는 데 유용 할 수 있습니다 .
즉, 더티 읽기 쿼리가 반환하는 결과는 추정치로 간주하고이를 기반으로 중요한 결정을 내리지 않는 한 괜찮습니다.
내가 가장 좋아하는 유스 케이스 read uncommited
는 트랜잭션 내부에서 발생하는 것을 디버깅하는 것입니다.
코드 라인을 단계별로 실행하는 동안 디버거에서 소프트웨어를 시작하면 트랜잭션이 열리고 데이터베이스가 수정됩니다. 코드가 중지 된 상태에서 쿼리 분석기를 열고 커밋되지 않은 읽기 격리 수준 을 설정하고 쿼리를 수행하여 진행 상황을 확인할 수 있습니다.
또한 장기 실행 프로 시저가 멈췄거나 데이터베이스를 올바르게 업데이트하는지 확인할 수 있습니다.
회사에서 지나치게 복잡한 저장 프로 시저를 만드는 것을 좋아한다면 좋습니다.
어떤 상황에서는 더 빠를 수 있다는 장점이 있습니다. 단점은 결과가 잘못되어 (아직 커밋되지 않은 데이터가 반환 될 수 있음) 결과가 반복 가능하다는 보장이 없다는 것입니다.
정확성에 관심이 있다면 이것을 사용하지 마십시오.
자세한 내용은 MSDN에 있습니다 .
더티 읽기 또는 격리 수준 0 잠금을 구현합니다. 이는 공유 잠금이 발행되지 않고 독점 잠금이 적용되지 않음을 의미합니다. 이 옵션을 설정하면 커밋되지 않거나 더티 데이터를 읽을 수 있습니다. 트랜잭션이 끝나기 전에 데이터의 값을 변경하고 행이 데이터 세트에 나타나거나 사라질 수 있습니다. 이 옵션은 트랜잭션의 모든 SELECT 문에있는 모든 테이블에서 NOLOCK을 설정하는 것과 동일한 효과를 갖습니다. 이것은 네 가지 격리 수준 중에서 가장 제한이 적습니다.
언제 사용할 수 READ UNCOMMITTED
있습니까?
엄지 손가락의 법칙
양호 : 지속적으로 변화하는 총계를 보여주는 큰 집계 보고서.
위험 : 거의 모든 것.
좋은 소식은 읽기 전용 대부분의 보고서가에 빠지게한다는 것입니다 좋은 종류.
자세한 세부 사항...
그것을 사용하십시오 :
- 현재 비 정적 데이터 (예 : 연도 별 매출)에 대한 거의 모든 사용자 대면 집계 보고서 오차 한계 (0.1 % 미만일 수 있음)의 위험이 있으며 이는 오차 입력과 같은 다른 불확실성 요인이나 정확히 1 분에서 정확히 데이터가 기록 될 때의 무작위성보다 훨씬 낮습니다.
SSRS와 같은 비즈니스 인텔리전스 부서가 수행 할 대부분의 작업이 여기에 해당합니다. 물론, $ 표시가 앞에있는 것은 예외입니다. 많은 사람들이 고객에게 서비스를 제공하고 그 돈을 창출하는 데 필요한 관련 핵심 메트릭스에 적용되는 것보다 훨씬 열성적인 돈을 설명합니다. (저는 회계사를 비난합니다).
위험 할 때
상세 수준으로 내려가는 모든 보고서. 세부 사항이 필요한 경우 일반적으로 모든 행이 결정과 관련이 있음을 의미합니다. 실제로, 작은 부분 집합을 차단하지 않고 끌 수 없다면 현재 편집중인 이유가있을 수 있습니다.
과거 데이터. 실질적인 차이는 거의 없지만 사용자는 끊임없이 변화하는 데이터가 완벽 할 수는 없다는 것을 이해하지만 정적 데이터에 대해서는 동일하게 느끼지 않습니다. 더티 리딩은 여기서 아프지 않지만 더블 리딩은 때때로 일어날 수 있습니다. 어쨌든 정적 데이터에 대한 차단이 없어야하는 이유는 무엇입니까?
쓰기 기능이있는 응용 프로그램을 공급하는 거의 모든 것.
OK 시나리오조차도 OK가 아닙니다.
- 큰 단일 트랜잭션을 사용하는 응용 프로그램이나 업데이트 프로세스가 있습니까? 당신이보고있는 많은 기록을 제거한 다음 다시 삽입하는 것? 이 경우 실제로
NOLOCK
해당 테이블에서 아무것도 사용할 수 없습니다 .
보고와 관련하여 Google은 모든보고 쿼리에서이 보고서를 사용하여 쿼리가 데이터베이스를 중단시키지 않도록합니다. 우리는 마이크로 초 단위의 데이터가 아닌 과거 데이터를 가져 오기 때문에 그렇게 할 수 있습니다.
이렇게하면 더티 읽기가 이루어지고 아직 커밋되지 않은 트랜잭션이 표시됩니다. 이것이 가장 확실한 대답입니다. 나는 단지 당신의 독서 속도를 높이기 위해 이것을 사용하는 것이 좋지 않다고 생각합니다. 좋은 데이터베이스 디자인을 사용하는 경우 다른 방법이 있습니다.
Its also interesting to note whats not happening. READ UNCOMMITTED does not only ignore other table locks. It's also not causing any locks in its own.
Consider you are generating a large report, or you are migrating data out of your database using a large and possibly complex SELECT statement. This will cause a shared lock that's may be escalated to a shared table lock for the duration of your transaction. Other transactions may read from the table, but updates are impossible. This may be a bad idea if its a production database since the production may stop completely.
If you are using READ UNCOMMITTED you will not set a shared lock on the table. You may get the result from some new transactions or you may not depending where it the table the data were inserted and how long your SELECT transaction have read. You may also get the same data twice if for example a page split occurs (the data will be copied to another location in the data file).
So, if its very important for you that data can be inserted while doing your SELECT, READ UNCOMMITTED may make sense. You have to consider that your report may contain some errors, but if its based on millions of rows and only a few of them are updated while selecting the result this may be "good enough". Your transaction may also fail all together since the uniqueness of a row may not be guaranteed.
A better way altogether may be to use SNAPSHOT ISOLATION LEVEL but your applications may need some adjustments to use this. One example of this is if your application takes an exclusive lock on a row to prevent others from reading it and go into edit mode in the UI. SNAPSHOT ISOLATION LEVEL does also come with a considerable performance penalty (especially on disk). But you may overcome that by throwing hardware on the problem. :)
You may also consider restoring a backup of the database to use for reporting or loading data into a data warehouse.
Use READ_UNCOMMITTED in situation where source is highly unlikely to change.
- When reading historical data. e.g some deployment logs that happened two days ago.
- When reading metadata again. e.g. metadata based application.
Don't use READ_UNCOMMITTED when you know souce may change during fetch operation.
It can be used for a simple table, for example in an insert-only audit table, where there is no update to existing row, and no fk to other table. The insert is a simple insert, which has no or little chance of rollback.
I always use READ UNCOMMITTED now. It's fast with the least issues. When using other isolations you will almost always come across some Blocking issues.
As long as you use Auto Increment fields and pay a little more attention to inserts then your fine, and you can say goodbye to blocking issues.
You can make errors with READ UNCOMMITED but to be honest, it is very easy make sure your inserts are full proof. Inserts/Updates which use the results from a select are only thing you need to watch out for. (Use READ COMMITTED here, or ensure that dirty reads aren't going to cause a problem)
Dirty Reads (특히 큰 보고서의 경우)로 이동하면 소프트웨어가 더 부드럽게 실행됩니다.
참고 URL : https://stackoverflow.com/questions/2471055/why-use-a-read-uncommitted-isolation-level
'Programing' 카테고리의 다른 글
작업 생성자의 취소 토큰 : 왜? (0) | 2020.04.29 |
---|---|
모범 사례 : 소프트웨어 버전 관리 (0) | 2020.04.29 |
봄 @ 자동 유선 사용법 (0) | 2020.04.29 |
안드로이드에서 가로 목록보기? (0) | 2020.04.29 |
Java EE 웹 개발, 어디서 시작하고 어떤 기술이 필요합니까? (0) | 2020.04.29 |