복붙노트

[SQL] 제로 SQL 디자인에 의해 교착 상태 - 어떤 코딩 패턴?

SQL

제로 SQL 디자인에 의해 교착 상태 - 어떤 코딩 패턴?

그것이 작동 할 때까지 기본적으로 쿼리를 조정 - 나는 매우 닷넷 2.0 웹 애플리케이션, 우리는 매우 실험적인 방법으로 SQL 교착 다루고있다 과거에 MS SQL 서버 2005의 상단에 실행에 아직 짜증나는 SQL 교착 상태를 자주 발생하고있다.

그러나,이 방법은 매우 불만족 발견 시간과 신뢰할 수없는. 지금까지 - 내가보기 엔 어떤 SQL 교착 상태가 발생되지 않음을 디자인으로 보장 할 결정적 쿼리 패턴을 따라하는 것을 선호합니다.

예를 들어, C #으로, 잠금이 교착 상태가 발생하지 않는 문제 것이라는 점을 자신의 사전 식 순서 보장하지만 다음주의해야합니다 같은 심플한 디자인 규칙을 프로그래밍 멀티 스레드.

교착 상태 방지를 보장 코딩 패턴 어떤 SQL이 있습니까?

해결법

  1. ==============================

    1.교착 상태 방지 코드를 작성하는 것은 정말 어렵습니다. 당신이 동일한 순서로 테이블에 액세스하는 경우에도 당신은 여전히 ​​교착 상태 [1]을 얻을 수 있습니다. 내가 도움이 될 몇 가지 방법을 통해 정성 들여 당신이 피하고 해결 교착 상황 나의 블로그에 글을 썼다.

    교착 상태 방지 코드를 작성하는 것은 정말 어렵습니다. 당신이 동일한 순서로 테이블에 액세스하는 경우에도 당신은 여전히 ​​교착 상태 [1]을 얻을 수 있습니다. 내가 도움이 될 몇 가지 방법을 통해 정성 들여 당신이 피하고 해결 교착 상황 나의 블로그에 글을 썼다.

    이 두 문장을 확인하려면 / 거래는 sp_lock 저장 프로 시저 시스템을 사용하여 각 문이 소비를 고정하는 관찰하여 그것을 달성 할 수 있습니다 교착하지 않습니다. 이렇게하려면 당신도 매우 빠른이거나 HOLDLOCK 힌트 열려있는 트랜잭션을 사용해야합니다.

    노트:

  2. ==============================

    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. ==============================

    3.이 문제에 대한 마법의 범용 솔루션은 실제로 그 일이 없다. 당신은 응용 프로그램에 동시성을 밀어 수 있지만 이것은 당신이 별도의 메모리 공간에서 실행되는 다른 프로그램과 조정이 필요 특히 매우 복잡 할 수 있습니다.

    이 문제에 대한 마법의 범용 솔루션은 실제로 그 일이 없다. 당신은 응용 프로그램에 동시성을 밀어 수 있지만 이것은 당신이 별도의 메모리 공간에서 실행되는 다른 프로그램과 조정이 필요 특히 매우 복잡 할 수 있습니다.

    교착 상태의 기회를 줄이기 위해 일반 답변 :

  4. ==============================

    4.나는 다음과 같은 유용한 읽기 / 쓰기 패턴이 일부 제약 주어진 죽은 잠금 증거입니다 생각 :

    나는 다음과 같은 유용한 읽기 / 쓰기 패턴이 일부 제약 주어진 죽은 잠금 증거입니다 생각 :

    제약 :

    쓰기주기 :

    읽기주기 :

    혜택:

    나도 그렇게 주석 / 수정하시기 바랍니다 작업이 필요합니다!

  5. ==============================

    5.당신이 말했듯이, 항상 같은 순서로 액세스 테이블은 교착 상태를 방지 할 수있는 아주 좋은 방법입니다. 또한, 가능한 한 트랜잭션을 단축.

    당신이 말했듯이, 항상 같은 순서로 액세스 테이블은 교착 상태를 방지 할 수있는 아주 좋은 방법입니다. 또한, 가능한 한 트랜잭션을 단축.

    또 다른 멋진 트릭 때마다 당신이 할 수있는 일에 2 SQL 문을 결합하는 것입니다. 단일 문은 항상 트랜잭션입니다. 사용 예 "UPDATE SELECT ..."또는 "INSERT ... SELECT"사용 "@@ ERROR"및 "@@ ROWCOUNT"대신 "SELECT COUNT"또는 "IF는 (EXISTS ...)"에 들어

    마지막으로, 확인하여 전화 코드가 쿼리를 시간의 설정 금액을 다시 게시하여 교착 상태를 처리 할 수 ​​있는지 확인하십시오. 가끔은 그냥의 정상적인 동작과 응용 프로그램이 처리 할 수 ​​있어야 발생합니다.

  6. ==============================

    6.락 취득의 일관된 순서에 추가 - 또 다른 경로는 실수 읽기,시 공유 의도로 잠금을 획득 낭비 시간 / 자원을 줄이기 위해 잠금 및 격리 힌트를 명시 적으로 사용하는 것이다.

    락 취득의 일관된 순서에 추가 - 또 다른 경로는 실수 읽기,시 공유 의도로 잠금을 획득 낭비 시간 / 자원을 줄이기 위해 잠금 및 격리 힌트를 명시 적으로 사용하는 것이다.

  7. ==============================

    7.아무도 (놀랍게도) 언급되지했다고 뭔가, SQL 서버에 관한 많은 잠금 문제는 DB의 쿼리 워크로드에 대한 인덱스를 커버의 오른쪽 세트로 제거 할 수 있다는 것입니다. 왜? 그것은 크게 테이블의 클러스터 된 인덱스에 북마크 조회의 수를 줄일 수 있기 때문에, 따라서 경합을 줄이고 잠금, (가 힙이 아니다 가정).

    아무도 (놀랍게도) 언급되지했다고 뭔가, SQL 서버에 관한 많은 잠금 문제는 DB의 쿼리 워크로드에 대한 인덱스를 커버의 오른쪽 세트로 제거 할 수 있다는 것입니다. 왜? 그것은 크게 테이블의 클러스터 된 인덱스에 북마크 조회의 수를 줄일 수 있기 때문에, 따라서 경합을 줄이고 잠금, (가 힙이 아니다 가정).

  8. ==============================

    8.앱을 통해 충분한 설계 제어가있는 경우 응용 프로그램에서 사용하는 데이터베이스 역할에서 권한 (명시 적으로 그 저장 프로 시저를 통해 업데이트를 허용) 삽입 / 특정 저장 프로 시저 및 제거 업데이트로 업데이트 / 삽입을 제한합니다.

    앱을 통해 충분한 설계 제어가있는 경우 응용 프로그램에서 사용하는 데이터베이스 역할에서 권한 (명시 적으로 그 저장 프로 시저를 통해 업데이트를 허용) 삽입 / 특정 저장 프로 시저 및 제거 업데이트로 업데이트 / 삽입을 제한합니다.

    모든에 (모든 연결이 클래스에서 가져와야합니다) 및 연결에 격리 수준 "더러운 읽기"설정이 "만 쿼리"를 지정하여 응용 프로그램의 특정 클래스에 분리 데이터베이스 연결 ... A (NOLOCK)에 동등 조인 .

    (특정 저장 프로 시저) 잠금을 일으킬 걸릴 수 있습니다 당신이 활동을 분리 그 방법은 "잠금 루프"의 아웃 "간단한 읽기".

  9. ==============================

    9.빠른 대답은 '노 보장 기술이 없다, 아무 없다.

    빠른 대답은 '노 보장 기술이 없다, 아무 없다.

    나는 그것이 아닌 사소한 처리량이있는 경우 당신이 디자인 원칙으로 일반적으로 응용 프로그램의 교착 상태 방지 할 수있는 방법을 볼 수 없습니다. 당신이 선제 경우 잠재적으로 당신이 그들을 필요로 끝나지 않는 경우에도 같은 순서로 프로세스에 필요한 수있는 모든 자원을 고정, 당신은 두 번째 프로세스가 필요로하는 최초의 락의 취득을 대기하는 비용이 많이 드는 문제를 위험 및 가용성이 영향을받습니다. 시스템의 자원의 수가 증가함에 따라 그리고, 심지어 사소한 과정은 모든 교착 상태를 방지하기 위해 같은 순서로 잠글 수 있습니다.

    대부분의 성능 및 가용성 문제와 같은 SQL 교착 상태 문제를 해결하는 가장 좋은 방법은 프로파일의 작업을보고 동작을 이해하는 것입니다.

  10. ==============================

    10.생각에 아니 직접 질문에 대한 대답,하지만 음식 :

    생각에 아니 직접 질문에 대한 대답,하지만 음식 :

    http://en.wikipedia.org/wiki/Dining_philosophers_problem

    은 "다이닝 철학자 문제"교착 상태 문제를 조사하기위한 오래된 사고 실험이다. 그것에 대해 읽는 것은 당신이 당신의 특정 상황에 대한 해결책을 찾을 수 있습니다.

  11. from https://stackoverflow.com/questions/111707/zero-sql-deadlock-by-design-any-coding-patterns by cc-by-sa and MIT license