2014-11-10 2 views
0

나는 게임의 백엔드에서 일하고있다. 플레이어는 먼저 데이터베이스에 저장된 티켓을 구매 한 다음 특정 상을받을 수 있습니다. 각 플레이어는 최대 60 장의 티켓을 구입할 수 있습니다.db lock을 피하는 방법

게임 당 총 티켓 수 - 10,000 티켓의 상한선을 설정하는 새로운 요구 사항이 나타났습니다. 구현은 구입 시점에 구매 한 총 티켓 수 + 현재 구매에 필요한 티켓 수가 해당 게임의 최대 티켓 수보다 작거나 같은지 확인하여 구매 엔드 포인트에 추가하는 작업을 포함합니다. 받아 들여진다.

티켓 테이블의 수를 사용하여 구매 한 티켓의 현재 수를 계산하면 다른 플레이어가 티켓을 구입할 수 있기 때문에 반환 값이 유효하지 않을 수 있습니다.

가능한 해결 방법은 구매 중에 티켓 표를 잠그는 것이지만 성능 및 사용자 환경에 부정적인 영향을 줄 수 있습니다. 다른 생각이 있으면 알려주세요.

+0

데이터베이스 레벨에서 잠금을 설정하는 대신 [Semaphore] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html)를 사용하도록 고려 했습니까? –

+0

신분증을 가지고도 신분을 삭제하지 않고 카운트를하는 대신, 맥스와 맥을 이용하여 서로를 공제하여 즉시 카운트를 얻을 수 있습니다. – Hozikimaru

답변

2

당신이 어려운 조건이라면, 동시에 여러 번 구매하는 것을 피해야합니다. 아마도 DB에서 적절한 테이블 잠금이 그러한 직렬화를 수행하는 가장 좋은 방법 일 것입니다. 다른 대안이있을 수 있지만 (즉, 프런트 엔드 어딘가에서 직렬화를 수행 할 수는 있지만) 구현하기가 더 쉽지 않으며 버그가 더 많이 발생하고 성능이 저하 될 수 있습니다.

실제로 DB에서 적절한 잠금없이 게임이 일관된 동작을 보이게하는 것은 어려울 수 있습니다. 반면에 명시 적으로 잠금이 필요하지 않습니다. 적절한 트랜잭션 격리 수준으로 데이터베이스를 구성하면 필요한 모든 잠금을 수행해야합니다.

여기에는 분명한 승리가 없으므로 실제로 성능을 테스트 할 수있을 때까지 성능 질문을 포기하는 것이 좋습니다. 이것이 충분하지 않다는 것이 판명되면 실제 측정을 통해 시스템의 어떤 부분이 튜닝의 이점을 가장 많이 쥘 수 있는지 판단 할 수 있습니다.