2011-01-13 2 views
8

얼마 전에 여러 사용자가 거래 생성을 처리하는 데 사용하는 응용 프로그램을 작성했습니다. 나는 얼마 동안 개발을 해보지 않았고 사용자 간의 동시성을 어떻게 관리했는지 기억이 안납니다. 따라서 디자인 측면에서 조언을 구합니다. 사용자 당데이터베이스 액세스 응용 프로그램에서 동시성을 관리하는 가장 좋은 방법은 무엇입니까?

  • 하나의 무거운 클라이언트 :

    원래 응용 프로그램

    은 다음과 같은 특징을 가지고 있었다.
  • 단일 데이터베이스.
  • 각 사용자가 거래를 삽입/업데이트/삭제할 수있는 데이터베이스에 대한 액세스.
  • 거래 테이블을 반영하는 응용 프로그램의 눈금. 누군가가 거래를 변경할 때마다 그 표가 업데이트됩니다.
  • WPF를 사용하고 있습니다.

    1. 가 나는 각 응용 프로그램에 대한 데이터베이스에 대한 연결에 대해 신경 안된다는 생각, 내가 잘못 알고 : 여기

내가 궁금한 건 무엇인가? 각각에 싱글 톤 (singleton)이 있다는 것을 고려할 때, 클라이언트 당 하나의 연결이 문제없이 기대됩니다.

  • 어떻게 액세스의 동시성을 막을 수 있습니까? 나는 데이터를 수정할 때 잠 가야하지만, 어떻게 기억하는지는 모르겠다.

  • 데이터베이스가 업데이트 될 때마다 (예 : 다른 사용자가) 자동으로 업데이트되도록 그리드를 설정하려면 어떻게해야합니까?

  • 도움을 주셔서 감사합니다.

    +3

    무엇 데이터베이스의 종류? –

    +0

    UI로 무엇을 사용하고 있습니까? ASP.NET? WinForms? WPF? 실버 라이트? – Jeff

    +0

    WPF를 사용하고 있습니다. 나는 설명에 그것을 추가했다. 감사합니다 – Goul

    답변

    2
    1. 연결 수를 줄이려면 연결 풀링을 고려하십시오. 참조 : http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

    2. 최대한 늦게 잠금을 설정하고 최대한 빨리 릴리스하여 동시성을 극대화하십시오. 일관성을 관리하거나 DB 저장 프로 시저에서 처리해야하는 여러 개의 db 작업이있는 경우 TransactionScope (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspxhttp://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx 참조)를 사용할 수 있습니다. 쿼리를 간단하게 유지하십시오. 리소스 경합 및 교착 상태 줄이기 위해 작업을 잠금하는 방법과 방법을 이해하기 위해 다음 사항을 따르 http://www.devx.com/gethelpon/10MinuteSolution/16488

    3. 내가 아니라고 확실히 다른 DB를하지만, SQL를 들어, SQL 종속성을 사용할 수 있습니다 참조 http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx

    +0

    답변 주셔서 감사합니다 지미! 그것은 내 모든 질문에 대한 기사를 주셔서 감사합니다. – Goul

    3

    일반적으로 동시성은 잠금을 사용하여 DBMS에 의해 부여됩니다. 잠금은 특정 자원에 배타적 잠금을 부여하고 다른 액세스가 제한되거나 대기되도록 허용하는 일종의 세마포어입니다 (커밋되지 않은 읽기를 사용하는 경우에만 제한됨).

    DBMS의 max_connections 설정을 터치 할 수있는 높이에 도달하지 않은 경우 연결 자체가 문제가되지 않습니다. 그렇지 않으면 유지 보수를 위해 또는 종료하기 위해 연결하는 데 문제가 발생할 수 있습니다.

    DBMS는 일반적으로 테이블 잠금 (MyISAM) 또는 행 잠금 (InnoDB, 대부분의 다른 DBMS) 개념을 사용합니다. 잠금 유형에 따라 잠금 볼륨이 결정됩니다. 테이블 잠금은 매우 빠르지 만 일반적으로 행 수준 잠금보다 열악한 것으로 간주됩니다.

    트랜잭션 (암시 적 또는 명시 적) 내에서 행 수준 잠금이 발생합니다. 수동으로 트랜잭션을 시작하면 트랜잭션 범위가 시작됩니다. 수동으로 트랜잭션 범위를 닫을 때까지 모든 변경 사항은이 정확한 트랜잭션에 대한 속성이됩니다. 변경 한 내용은 ACID paradigm에도 적용됩니다.

    트랜잭션 범위와이 트랜잭션을 사용하는 방법은이 플랫폼에 너무 긴 주제입니다. 원할 경우이 주제에 대한 추가 정보가있는 링크를 게시 할 수 있습니다.

    자동 업데이트의 경우 대부분의 데이터베이스는 데이터베이스의 특정 동작 (예 : 새 레코드 만들기 또는 레코드 변경)에서 실행되는 코드 인 트리거 메커니즘을 지원합니다.이 트리거 내부에 코드를 게시 할 수 있습니다. 그러나 언어가 가능할지라도 변경 사항을 트리거로부터 실제로 "수행"하지 않고 변경 사항을받는 응용 프로그램에만 알려야합니다. 트리거 코드가 끝날 때까지 코드를 트리거 한 액션은 일시 중지됩니다. 즉, 필요하다면 기울기가 가장 좋습니다.

    +0

    도움 TME에 감사드립니다. 매우 유익하고 동시성 메커니즘에 잘 대답합니다. 환호 – Goul