【问题标题】:Database to store list of dictionaries存储字典列表的数据库
【发布时间】:2023-03-03 22:15:01
【问题描述】:

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

项目ID:abcd 锁定:假 资源: [ { 资源:CPU 可用名额:50 已用配额:35 },{ 资源:StaticIps 可用名额:70 已用配额:45 } ]

我曾考虑将其放入 MySQL 数据库中,但想不出合适的方法来嵌套列表以便我们可以锁定“ProjectId”字段。

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

【问题讨论】:

    标签: mysql database mongodb postgresql redis


    【解决方案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 表;他们不支持交易。

    【讨论】:

    • 我对这个答案的质量感到惊讶。谢谢,这似乎填补了我的用例!
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2018-02-12
    • 2013-09-23
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多