MySQL에서는 다음 열이있는 테이블을 만들 수 있습니다.
ProjectId VARCHAR(100)
ResourceName VARCHAR(100)
AvailableQuota INT
UsedQuota INT
ProjectId 및 ResourceName 열은 복합 기본 키입니다.
그런 다음 dbms 트랜잭션을 사용하여 테이블의 데이터 사용을 직렬화 할 수 있습니다. 당신이 읽을 수행 할 모든 있지만 변경할 경우 데이터를 변경해야하는 경우, 자원 당신이 반면에
BEGIN TRANSACTION;
SELECT ResourceName, AvailableQuota, UsedQuota
FROM table
WHERE ProjectId = 'whatever'
LOCK IN SHARE MODE;
/* do whatever you need to do */
COMMIT;
을 수행 할 수 있습니다, 당신은 이런 종류의 작업을 수행 할 수 있습니다. 당신이이 so-called Locking Reads in a transaction이 방법을 사용하면 당신이 커밋 작업을 실행할 때까지
BEGIN TRANSACTION;
SELECT ResourceName, AvailableQuota, UsedQuota
FROM table
WHERE ProjectId = 'whatever'
FOR UPDATE;
/* do whatever you need to do */
UPDATE table SET AvailableQuota=AvailableQuota - 10,
UsedQuota=UsedQuota + 10
WHERE ProjectId = 'whatever' AND ResourceNme = 'something'
COMMIT;
, 다른 MySQL의 클라이언트는 대기합니다.
이를 위해 MyISAM 테이블을 사용하지 마십시오. 그들은 트랜잭션을 지원하지 않습니다.
이 답변의 품질에 놀랐습니다. 고마워, 내 사용 사례를 채우는 것 같다! – user3325789