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

时间:2017-12-21 00:48:00

标签: mysql database mongodb postgresql redis

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

ProjectID:abcd 锁定:错误 资源:[     {         资源:CPU         可用配额:50         UsedQuota:35 },{         资源:StaticIps         可用配额:70         UsedQuota:45     } ]

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

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

1 个答案:

答案 0 :(得分: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表;他们不支持交易。