[SQL] 제로 SQL 디자인에 의해 교착 상태 - 어떤 코딩 패턴?
SQL제로 SQL 디자인에 의해 교착 상태 - 어떤 코딩 패턴?
그것이 작동 할 때까지 기본적으로 쿼리를 조정 - 나는 매우 닷넷 2.0 웹 애플리케이션, 우리는 매우 실험적인 방법으로 SQL 교착 다루고있다 과거에 MS SQL 서버 2005의 상단에 실행에 아직 짜증나는 SQL 교착 상태를 자주 발생하고있다.
그러나,이 방법은 매우 불만족 발견 시간과 신뢰할 수없는. 지금까지 - 내가보기 엔 어떤 SQL 교착 상태가 발생되지 않음을 디자인으로 보장 할 결정적 쿼리 패턴을 따라하는 것을 선호합니다.
예를 들어, C #으로, 잠금이 교착 상태가 발생하지 않는 문제 것이라는 점을 자신의 사전 식 순서 보장하지만 다음주의해야합니다 같은 심플한 디자인 규칙을 프로그래밍 멀티 스레드.
교착 상태 방지를 보장 코딩 패턴 어떤 SQL이 있습니까?
해결법
-
==============================
1.교착 상태 방지 코드를 작성하는 것은 정말 어렵습니다. 당신이 동일한 순서로 테이블에 액세스하는 경우에도 당신은 여전히 교착 상태 [1]을 얻을 수 있습니다. 내가 도움이 될 몇 가지 방법을 통해 정성 들여 당신이 피하고 해결 교착 상황 나의 블로그에 글을 썼다.
교착 상태 방지 코드를 작성하는 것은 정말 어렵습니다. 당신이 동일한 순서로 테이블에 액세스하는 경우에도 당신은 여전히 교착 상태 [1]을 얻을 수 있습니다. 내가 도움이 될 몇 가지 방법을 통해 정성 들여 당신이 피하고 해결 교착 상황 나의 블로그에 글을 썼다.
이 두 문장을 확인하려면 / 거래는 sp_lock 저장 프로 시저 시스템을 사용하여 각 문이 소비를 고정하는 관찰하여 그것을 달성 할 수 있습니다 교착하지 않습니다. 이렇게하려면 당신도 매우 빠른이거나 HOLDLOCK 힌트 열려있는 트랜잭션을 사용해야합니다.
노트:
-
==============================
2.제로 교착 상태는 모든 테이블을 알고 있어야하기 때문에 일반적인 경우에 기본적으로 매우 비용이 많이 드는 문제 / OBJ (이은에 select 포함) 읽기 및 실행중인 모든 트랜잭션에 대한 수정 거라고. 라고 일반적인 철학은 (심지어 2PL 더 교착 상태를 보장하지 않습니다 http://en.wikipedia.org/wiki/Two_phase_locking) (지르지 두 단계와 혼동) 정확한 2 단계 로킹을 주문
제로 교착 상태는 모든 테이블을 알고 있어야하기 때문에 일반적인 경우에 기본적으로 매우 비용이 많이 드는 문제 / OBJ (이은에 select 포함) 읽기 및 실행중인 모든 트랜잭션에 대한 수정 거라고. 라고 일반적인 철학은 (심지어 2PL 더 교착 상태를 보장하지 않습니다 http://en.wikipedia.org/wiki/Two_phase_locking) (지르지 두 단계와 혼동) 정확한 2 단계 로킹을 주문
대규모 성능 (공짜 점심은 없다) 모든 거래도 간단한 SELECT 문 주위를 기다리는 동안 실행되는 그런 일 원인을 공격하기 때문에 거의 DBMS 실제로 엄격한 2PL을 구현합니다.
이것은 당신이 정말로 관심 뭔가 어쨌든, SQL Server의 SET 격리 수준에서보세요. 당신은 필요에 따라 그것을 조정할 수 있습니다. http://en.wikipedia.org/wiki/Isolation_level
더 많은 정보 직렬화에 위키 피 디아를 참조하십시오 http://en.wikipedia.org/wiki/Serializability
말했다 - 좋은 비유는 소스 코드의 수정과 같다 : 체크 초기와 자주에. 작은 트랜잭션을 유지 (벽시계 시간이 다른 사람과 피할 충돌을 도움) (SQL 문 #에서 행의 # 수정)하고 신속하게. 그것은 좋은 단일 트랜잭션에서 일을 많이 할 단정 할 수있다 - 그리고 일반적으로 그 철학에 동의 -하지만 당신은 교착 상태가 많이 발생하는 경우 다음 작은 것들과에 트랜스 업을 깰 수 있습니다 당신이 함께 이동 응용 프로그램에서 자신의 상태를 확인합니다. TRAN 1 - OK Y / N? OK Y / N - Y 경우, TRAN 2를 보내? 등 등
여담하는 DBA도 (수천 명의 동시 사용자를 측정하는 앱은 다중 사용자 DB의) 개발자가되는 내 몇 년과 마찬가지로 나는 그것을 (또는 변경 분리의 특별한 인식이 필요하다는 등의 엄청난 문제가 교착 상태를 발견 적이 없다 수준 싫든 좋든, 등).
-
==============================
3.이 문제에 대한 마법의 범용 솔루션은 실제로 그 일이 없다. 당신은 응용 프로그램에 동시성을 밀어 수 있지만 이것은 당신이 별도의 메모리 공간에서 실행되는 다른 프로그램과 조정이 필요 특히 매우 복잡 할 수 있습니다.
이 문제에 대한 마법의 범용 솔루션은 실제로 그 일이 없다. 당신은 응용 프로그램에 동시성을 밀어 수 있지만 이것은 당신이 별도의 메모리 공간에서 실행되는 다른 프로그램과 조정이 필요 특히 매우 복잡 할 수 있습니다.
교착 상태의 기회를 줄이기 위해 일반 답변 :
-
==============================
4.나는 다음과 같은 유용한 읽기 / 쓰기 패턴이 일부 제약 주어진 죽은 잠금 증거입니다 생각 :
나는 다음과 같은 유용한 읽기 / 쓰기 패턴이 일부 제약 주어진 죽은 잠금 증거입니다 생각 :
제약 :
쓰기주기 :
읽기주기 :
혜택:
나도 그렇게 주석 / 수정하시기 바랍니다 작업이 필요합니다!
-
==============================
5.당신이 말했듯이, 항상 같은 순서로 액세스 테이블은 교착 상태를 방지 할 수있는 아주 좋은 방법입니다. 또한, 가능한 한 트랜잭션을 단축.
당신이 말했듯이, 항상 같은 순서로 액세스 테이블은 교착 상태를 방지 할 수있는 아주 좋은 방법입니다. 또한, 가능한 한 트랜잭션을 단축.
또 다른 멋진 트릭 때마다 당신이 할 수있는 일에 2 SQL 문을 결합하는 것입니다. 단일 문은 항상 트랜잭션입니다. 사용 예 "UPDATE SELECT ..."또는 "INSERT ... SELECT"사용 "@@ ERROR"및 "@@ ROWCOUNT"대신 "SELECT COUNT"또는 "IF는 (EXISTS ...)"에 들어
마지막으로, 확인하여 전화 코드가 쿼리를 시간의 설정 금액을 다시 게시하여 교착 상태를 처리 할 수 있는지 확인하십시오. 가끔은 그냥의 정상적인 동작과 응용 프로그램이 처리 할 수 있어야 발생합니다.
-
==============================
6.락 취득의 일관된 순서에 추가 - 또 다른 경로는 실수 읽기,시 공유 의도로 잠금을 획득 낭비 시간 / 자원을 줄이기 위해 잠금 및 격리 힌트를 명시 적으로 사용하는 것이다.
락 취득의 일관된 순서에 추가 - 또 다른 경로는 실수 읽기,시 공유 의도로 잠금을 획득 낭비 시간 / 자원을 줄이기 위해 잠금 및 격리 힌트를 명시 적으로 사용하는 것이다.
-
==============================
7.아무도 (놀랍게도) 언급되지했다고 뭔가, SQL 서버에 관한 많은 잠금 문제는 DB의 쿼리 워크로드에 대한 인덱스를 커버의 오른쪽 세트로 제거 할 수 있다는 것입니다. 왜? 그것은 크게 테이블의 클러스터 된 인덱스에 북마크 조회의 수를 줄일 수 있기 때문에, 따라서 경합을 줄이고 잠금, (가 힙이 아니다 가정).
아무도 (놀랍게도) 언급되지했다고 뭔가, SQL 서버에 관한 많은 잠금 문제는 DB의 쿼리 워크로드에 대한 인덱스를 커버의 오른쪽 세트로 제거 할 수 있다는 것입니다. 왜? 그것은 크게 테이블의 클러스터 된 인덱스에 북마크 조회의 수를 줄일 수 있기 때문에, 따라서 경합을 줄이고 잠금, (가 힙이 아니다 가정).
-
==============================
8.앱을 통해 충분한 설계 제어가있는 경우 응용 프로그램에서 사용하는 데이터베이스 역할에서 권한 (명시 적으로 그 저장 프로 시저를 통해 업데이트를 허용) 삽입 / 특정 저장 프로 시저 및 제거 업데이트로 업데이트 / 삽입을 제한합니다.
앱을 통해 충분한 설계 제어가있는 경우 응용 프로그램에서 사용하는 데이터베이스 역할에서 권한 (명시 적으로 그 저장 프로 시저를 통해 업데이트를 허용) 삽입 / 특정 저장 프로 시저 및 제거 업데이트로 업데이트 / 삽입을 제한합니다.
모든에 (모든 연결이 클래스에서 가져와야합니다) 및 연결에 격리 수준 "더러운 읽기"설정이 "만 쿼리"를 지정하여 응용 프로그램의 특정 클래스에 분리 데이터베이스 연결 ... A (NOLOCK)에 동등 조인 .
(특정 저장 프로 시저) 잠금을 일으킬 걸릴 수 있습니다 당신이 활동을 분리 그 방법은 "잠금 루프"의 아웃 "간단한 읽기".
-
==============================
9.빠른 대답은 '노 보장 기술이 없다, 아무 없다.
빠른 대답은 '노 보장 기술이 없다, 아무 없다.
나는 그것이 아닌 사소한 처리량이있는 경우 당신이 디자인 원칙으로 일반적으로 응용 프로그램의 교착 상태 방지 할 수있는 방법을 볼 수 없습니다. 당신이 선제 경우 잠재적으로 당신이 그들을 필요로 끝나지 않는 경우에도 같은 순서로 프로세스에 필요한 수있는 모든 자원을 고정, 당신은 두 번째 프로세스가 필요로하는 최초의 락의 취득을 대기하는 비용이 많이 드는 문제를 위험 및 가용성이 영향을받습니다. 시스템의 자원의 수가 증가함에 따라 그리고, 심지어 사소한 과정은 모든 교착 상태를 방지하기 위해 같은 순서로 잠글 수 있습니다.
대부분의 성능 및 가용성 문제와 같은 SQL 교착 상태 문제를 해결하는 가장 좋은 방법은 프로파일의 작업을보고 동작을 이해하는 것입니다.
-
==============================
10.생각에 아니 직접 질문에 대한 대답,하지만 음식 :
생각에 아니 직접 질문에 대한 대답,하지만 음식 :
http://en.wikipedia.org/wiki/Dining_philosophers_problem
은 "다이닝 철학자 문제"교착 상태 문제를 조사하기위한 오래된 사고 실험이다. 그것에 대해 읽는 것은 당신이 당신의 특정 상황에 대한 해결책을 찾을 수 있습니다.
from https://stackoverflow.com/questions/111707/zero-sql-deadlock-by-design-any-coding-patterns by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 날짜 시간에서 시간을 추출 (2005 SQL 서버) (0) | 2020.05.20 |
---|---|
[SQL] 안드로이드, 방법의 SQLiteDatabase에서 SQL 파일을 간부 인하는 (0) | 2020.05.20 |
[SQL] 매우 큰 테이블의 성능을 계산 MYSQL (0) | 2020.05.20 |
[SQL] 성능과 같은 '% 검색어 %'전체 텍스트 검색을 CONTAINS 쿼리 대 (0) | 2020.05.20 |
[SQL] PL / SQL에서 동적 SELECT INTO 절에 바인드 변수 사용 (0) | 2020.05.20 |