2017-12-21 16 views
0

データベースに以下の構造を格納する方法が必要です。文脈は、私はリソースのリストを含むテーブルを持っており、同時書き込みを防ぐために操作を行うときにこのテーブルをロックする必要があるということです。辞書のリストを格納するデータベース

PROJECTID:ABCD ロック:偽 資源:[ { リソース:CPU AvailableQuota:50 UsedQuota:35 }、{ リソース:StaticIps AvailableQuota:70 UsedQuota:45 } ]

私はそれをMySQLデータベースに入れることを考えましたが、適切な方法でリストをネストすることはできないので、 'ProjectId'フィールドをロックすることができます。

この形式のデータ構造ネストを可能にするデータベース/データストアへのポインタはありますか?

答えて

1

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テーブルを使用しないでください。トランザクションをサポートしていません。

+0

私はこの回答の質に驚いています。ありがとう、これは私の使用例を埋めるようだ! – user3325789

関連する問題