2012-06-27 3 views
0

주문 행이있는 주문이 있고 여러 사용자가 주문 행을 추가 할 수있는 다중 사용자 시스템이 있다고 가정 해보십시오. 주문은 데이터베이스에 유지됩니다.여러 사용자가 비즈니스 규칙을 위반하지 않도록 보장

주문에 대해 10 개의 주문 행만 작성할 수 있다는 비즈니스 규칙이 있습니다.

이 규칙을 위반하지 않았는지 확인하려면 어떻게해야합니까? 메모리를 확인하고 잠금 장치를 적용해야합니까? 아니면 절차를 통해 데이터베이스에서이를 처리해야합니까?

+0

구현하기 어려운 데이터베이스 제약 조건은 어떻습니까? 여기에 내 공헌을 참조하십시오 : http://stackoverflow.com/a/11210474/905902 – wildplasser

+0

주문 라인을 삭제할 수 있습니까? –

+0

예, 삭제할 수 있습니다. –

답변

2

트리거, 제한 조건, 비즈니스 규칙 논리 W 데이터 구조를 포함하여이를 처리 할 수있는 옵션이 있습니다.

내가 선호하는 대상은 다음과 같습니다. 저장 프로 시저의 모든 주문/삭제/업데이트를 주문 라인에 래핑하고 응용 프로그램 계층에 저장 프로 시저를 통해 테이블 ​​액세스 권한을 부여하십시오. 그런 다음이 절차는이 비즈니스 규칙 및 기타 비즈니스 규칙을 시행 할 수 있습니다. 또한 실행 중에 테이블이 업데이트되도록 잠그므로 한 명의 사용자 만이 주어진 순간에 테이블을 변경할 수 있습니다.

비슷한 접근법은 테이블에 트리거를 대신 삽입하는 것입니다. 이로 인해이 (및 기타) 비즈니스 규칙이 실패 할 때 삽입이 실패하게됩니다. 이 문제의 주된 관심사는 유지 관리 가능성입니다. 한 테이블에서 하나의 트리거가 문제가되지 않습니다. 그러나 계단식 삽입/삭제를 사용하여 여러 테이블에 대해이 작업을 시작하면 방아쇠로 가득 찬 악몽으로 끝날 수 있습니다.

의견 중 하나가 제시하는 것처럼 제약 조건을 사용하여이를 시도 할 수 있습니다. 제약 조건을 구현하는 방법을 거의 제어 할 수 없기 때문에 성능 테스트를하고 싶을 것입니다.

또한 주문 테이블에는 주문 열 10 개가있을 수 있습니다. 이것은이 규칙을 강력하게 시행 할 것입니다. 그러나 각 주문 행마다 별도의 열을 갖고 삭제와 같은 문제를 처리해야하는 비용이 있습니다.

이 경우 적절하지 않은 또 다른 옵션은 응용 프로그램 레벨에서 비즈니스 규칙을 적용하는 것입니다. 그러나 여러 동시 사용자가있는 경우 데이터베이스에서이 작업을 수행해야합니다.

+0

답변 해 주셔서 감사합니다. 임계 영역/뮤텍스를 사용하여 응용 프로그램 수준에서 사용하지 않는 이유는 무엇입니까? –

+1

데이터베이스가이 기능을 지원할 수 있기 때문입니다. 응용 프로그램에서 이미이 작업을 수행 할 수있는 데이터베이스를 사용하고있을 때 개발 세계에 다른 요소를 도입해야하는 이유는 무엇입니까? –

+3

나는 Gordon에 동의한다. SP를 객체에 대한 메소드로 취급하고 객체 자체가 자체 상태를 유지 관리해야합니다. DB가 여러 코드 기반으로 여러 응용 프로그램에서 공유되는 경우 특히 그렇습니다. *** 그러나 ***에는 응용 프로그램이 하나뿐이므로 단일 응용 프로그램에서 ORM 또는 다른 추상화 계층을 사용하는 코드 기반은 데이터 관리를위한 동일하게 관리 가능한 패턴입니다. 그렇더라도 여러 응용 프로그램 인스턴스의 동시성은 종종 DB 자체에서 처리하기가 더 쉽습니다. – MatBailie

1

많은 수의 일명 사용자가 모두 한 번에 하나의 주문에 동시에 줄을 추가하려고한다는 최악의 경우를 가정합니다. (심지어 더 나쁜 것은, 한 번에 10 개를 넘지는 않지만 모든 사람들이 다양한 라인을 추가하려고한다고 가정 해 봅시다. GUI가 최소한 그 정도까지 제어 할 수 있습니다). 이 같은 상황에 이르게 : 도착, 그의 행에 대한 공간이 확인

  • B 검사를 얻는다, 그녀의 행에 대한 공간이

    • 검사 확인
    • A는 그녀의 행이 인생을 좋은
    • 입니다 추가
    • B는 "이제 중앙의 일부 양식이 필요하다,
    • 이 모든 (11)는이를 방지하기 위해 두 번째

    미만 십분 내에서 발생했다가, 자신의 행을 추가합니다 체크 포인트 (checkpoint) "또는 모든 사용자가 행을 추가 할 수 있는지 결정하기 위해 이동하는 규제 기관을 말합니다. 그들이 체크 포인트를 통과하면 추가 할 수 있습니다. 통과하지 못하면 그들은 할 수 없습니다. 체크 포인트는 절대적이어야합니다 : 일단 승인을 받거나 할당하면, 그 결정은 모든 후속 점검에 영향을 미칩니다 (즉, 10 번째 줄을 확인하고 부여 받았을 때 이전에 아무도 그 사람에게 부여되지 않았고 이후에 다른 사람에게 부여되지 않습니다) .

    구현 방법에는 여러 가지가 있으며, 모두 데이터베이스 트랜잭션 (ACID 속성)과 관련됩니다. 다른 사용자와의 블로킹이나 교착 상태를 피하기 위해 트랜잭션은 항상 가능한 한 짧아야합니다. 이것은 까다로운 코드 일 수 있으며, 돈을 위해 프로세스를 구현/제어하는 ​​가장 좋은 방법은 저장 프로 시저 (@Gordon Linoff가 말한 것)를 통한 것입니다.

  • +0

    비관적 인 잠금 작동 여부 –

    +2

    하지만 (실제로 매우 일반적 인) 시나리오를 고려해야합니다. 한 명의 사용자가 편집을 시작하고 (자물쇠에 넣음) 점심을 먹기 시작합니다. 올바른 잠금을 사용하는 저장 프로 시저를 사용하는 것이 좋습니다 (줄이 아니라 순서 자체를 잠글 필요가 있음). 사용자 디스플레이에서 주문 상태 (줄 수)를 정기적으로 업데이트하는 것도 도움이 될 것입니다. – Arvo

    +0

    @Arvo와의 전체 계약. –

    관련 문제