用于存储词典列表的数据库

问题描述 投票:0回答:1

我需要一种方法将以下结构存储在数据库中。上下文是我有一个包含资源列表的表,我需要能够在执行操作以防止并发写入时锁定此表。

ProjectID:abcd Lock:False Resources:[{Resource:CPU AvailableQuota:50 UsedQuota:35},{Resource:StaticIps AvailableQuota:70 UsedQuota:45}]

我曾想过把它放在一个MySQL数据库中,但是想不到一个合适的方法来嵌套列表,这样我们就可以锁定'ProjectId'字段了。

任何指向允许这种形式的数据结构嵌套的数据库/数据存储的指针?

mysql database mongodb postgresql redis
1个回答
1
投票

在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;

另一方面,如果您需要更改数据,则可以执行此类操作。

   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;

当您以这种方式使用这些so-called Locking Reads in a transaction时,其他MySQL客户端将等到您发出提交操作。

为此避免使用MyISAM表;他们不支持交易。

© www.soinside.com 2019 - 2024. All rights reserved.