2016-11-07 2 views
3

올바른 SQL 솔루션에 문제가 있습니다.SQL SUM 식 및 잠금

현재 상황 : 데이터베이스에 은행 거래 (신용 및 직불)가 포함 된 테이블이 있습니다.

  • 신용 거래는 posivitive 양 (+)로 서명되고
  • 직불 거래와 같은 음수 금액 (-).

DB를 사용하는 응용 프로그램은 다중 사용자 웹 응용 프로그램이므로 트랜잭션 테이블에는 여러 사용자가 참조하는 많은 행이 있습니다. 일부 webapp 작업은 트랜잭션 테이블을 사용하고 직불 거래 (작업 가격)를 사용하여 기록 된 사용자의 실제 잔액을 확인해야합니다.

나는이 메커니즘의 아키텍처에 대해 생각하고 몇 가지 질문이 있습니다

  1. 가 거래 신용 및 직불 결제 할 때마다 사용자 요청의 합으로 균형을 계산하는 것이 좋습니다를? db에 비효율적 일 수 있습니다. 아마 어딘가에 스냅 사진을 저장해야합니까?

  2. 한 사용자가 신용/직불 거래의 합계로 "잔액"을 확인하고 같은 시간에 다른 사용자가 차변 거래를 저장하면 (데이터가 빠르기 때문에) 데이터 통합을 보장하는 방법은 무엇입니까? 나는 비관적 인 자물쇠에 대해 생각하지만 잠겨 있어야하는 것은 무엇입니까? 나는 (내가 사용하는 데이터베이스) 집계 (SUM)와 잠금 PostgreSQL을에 불가능할 수 있음을 알고있다. "내 영어

죄송합니다, 나는 희망을 내 문제가 이해할 수있다. :

답변

1

내가 고려할 것 다음 중 하나를

는 저울이 정확되는 날짜와 함께, 계정 기록에 균형을 저장

현재 잔액이 해당 날짜 이후 모든 트랜잭션을 계정 잔액을 읽고, 다음을 포함의 문제입니다 얻기.

자정 이후 한 시간에 균형을 조정하고 시간 소인을 다시 계산하는 예약 된 작업을 가질 수 있습니다.

OR (이것은 나의 선호하는 솔루션입니다) :

거래 또는 거래의 배치가로드 될 때마다, 관련 계정 기록을 잠그고 같은 트랜잭션의 일부로 삽입 의 값으로 그들을 업데이트.

이렇게하면 계정에 대한 일련 번호로 액세스 할 수있는 이점이 있습니다. 그러면 계좌 이체 계산을 기반으로 한 결정 때문에 거래를 진행할 수 있는지 여부를 결정할 수 있습니다. 당신이 더 나은 성능을 가질 수있는 사용자 계정의 균형, 뭔가를하지 않으려 경우

1

, 내가 실험 것 접근 방식은 다음과 같습니다

  • 각 트랜잭션은 하나의 계정과 관련된 것입니다.
  • 각 거래는 해당 거래 이후 계정 잔액을가집니다.

따라서 해당 계정의 최종 거래에는 현재 잔액이 있습니다.

예 :

TransactionId | AccountId | Datetime | Ammount | Balance 
      1 |   1 | 7/11/16 |  0 |  0 
      2 |   1 | 7/11/16 |  500 |  500 
      3 |   1 | 7/11/16 |  -20 |  480 
      4 |   1 | 8/11/16 |  50 |  530 
      5 |   1 | 8/11/16 | -200 |  330 

당신이 (즉, 계정 아이디와 마지막 트랜잭션) 계정 잔액을 얻을 수있을 것입니다 그리고 당신은 시간이 지남에 균형 변화에 더 나은 뷰를 제공 할 수있을 것입니다 이런 식으로.

+0

감사합니다. 따라서 트랜잭션을 datetime (주어진 AccountId)별로 정렬 한 다음 마지막 트랜잭션을 가져온 다음 실행 중에 잠급니다 : check-balance 및 다른 트랜잭션 저장? 내 TransactionId 기본 키는 UUID이므로 정렬 할 수 없습니다. Datetime 정밀도는 어떻습니까? 예 : 몇 가지 거래가 동일한 dateTime (DD/MM/YYYY HH : mm : ss.SSS) 일 때 상황이 가능합니까? – user6492999

+0

@ user6492999 1) ** 잠금을 설정해야합니다 **. ** 새 거래를 ** 삽입 할 때 ** 마지막 ** 잔액을 선택했는지 확인하고 싶습니다. 트래픽이 많을 것으로 예상되는 경우 작업을 최적화하고 교착 상태를 피하기 위해 데이터베이스 트랜잭션에 대해 읽어야합니다. – Edu

+0

@ user6492999 2) 정확도는 매우 높다고 생각하지만 두 개의 연속 삽입이 동일한 날짜 시간을 가질 수 있는지 테스트 할지라도 불일치가 발생할 수 있습니다. datetime 정밀도는 데이터베이스 엔진 설명서에서 확인할 수 있습니다. Postgresql의 경우 여기에서 최신 버전 (9.6)을 찾을 수 있습니다. https://www.postgresql.org/docs/9.6/static/datatype-datetime.html – Edu