데이터베이스에서 이러한 상황이 자주 발생합니다. 기본 테이블 A와 하위 테이블 B. 테이블 B에는 테이블 A의 기본 키가 외래 키로 포함되어 있습니다. 데이터를 삽입하려면 먼저 테이블 A에 삽입한 다음 테이블 A의 ID를 얻은 다음 테이블 B에 삽입합니다. 삭제 작업을 수행하려면 하위 테이블 B를 먼저 삭제한 후 기본 테이블 A를 삭제하세요. 프로그래밍에서는 두 테이블에 대한 작업이 하나의 트랜잭션으로 완료됩니다.
시스템을 자주 사용하는 경우 삽입과 삭제 작업이 동시에 발생할 수 있습니다. 이때 삽입 트랜잭션은 먼저 메인 테이블 A에 배타적 잠금을 설정한 후 하위 테이블 B에 액세스합니다. 동시에 삭제 트랜잭션은 하위 테이블 B에 배타적 잠금을 설정한 다음 메인 테이블 A에 액세스합니다. 삽입 트랜잭션은 항상 테이블 A를 독점하여 테이블 B에 액세스하기를 기다리고 삭제 트랜잭션도 테이블 B를 독점하여 테이블 A에 액세스하기를 기다립니다. 따라서 두 트랜잭션은 서로를 위해 테이블을 독점하며 상대방이 해제되기를 기다립니다. 교착상태를 일으키는 자원.
이를 수행하는 세 가지 방법을 들었습니다.
1. 두 테이블 AB 간의 외래 키 관계를 취소하여 데이터를 삭제할 때 먼저 메인 테이블 A를 삭제한 다음 하위 테이블 B를 삭제하면 이 두 테이블 작업의 트랜잭션 액세스 순서는 일관됩니다.
2 테이블 A의 데이터를 삭제하기 전에 먼저 트랜잭션을 사용하여 테이블 B의 관련 외래 키가 테이블 A의 다른 데이터를 가리키도록 합니다(예를 들어 테이블 A에 데이터 행을 생성하고 기본 키를 0으로 설정합니다. 이 행은 삭제 작업을 수행하면 두 테이블 AB에서 삭제할 데이터 간의 관계가 제거됩니다. 그런 다음 삭제 트랜잭션을 사용하여 먼저 테이블 A의 데이터를 삭제한 다음 테이블 B의 데이터를 삭제하여 삽입 트랜잭션으로 일관된 테이블 액세스를 달성하고 교착 상태를 방지할 수 있습니다.
3. 외래 키 관계에서 "삭제 규칙"을 "계단식"으로 설정하여 삭제 트랜잭션에서는 하위 테이블 B를 조작하지 않고 메인 테이블 A만 직접 삭제하면 됩니다. 왜냐하면 삭제 규칙을 cascade로 설정하면 메인 테이블의 데이터가 삭제됨과 동시에 서브 테이블의 외래 키와 관련된 모든 데이터도 함께 삭제되기 때문입니다.
위 세 가지 해결책은 모두 동료들이 제안한 것이므로 어떤 방법을 사용해야 할지 모르겠습니다.
이런 상황에서 교착상태를 방지할 수 있는 다른 좋은 방법이 있는지 궁금합니다.
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html