我需要一种方法将以下结构存储在数据库中。上下文是我有一个包含资源列表的表,我需要能够在执行操作以防止并发写入时锁定此表。
ProjectID:abcd 锁定:错误 资源:[ { 资源:CPU 可用配额:50 UsedQuota:35 },{ 资源:StaticIps 可用配额:70 UsedQuota:45 } ]
我曾想过把它放在一个MySQL数据库中,但是不能想出一个合适的方法来嵌套列表,这样我们就可以锁定“ProjectId”。字段。
指向允许这种形式的数据结构嵌套的数据库/数据存储的指针吗?
答案 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表;他们不支持交易。