MySQLでは、次の列のテーブルを作成できます。
ProjectId VARCHAR(100)
ResourceName VARCHAR(100)
AvailableQuota INT
UsedQuota INT
[プロジェクトID]列と[リソース名]列は複合主キーです。
次に、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