Мне нужен способ хранения следующей структуры в базе данных. Контекст заключается в том, что у меня есть таблица, которая включает список ресурсов, и мне нужно блокировать эту таблицу, когда я выполняю операции для предотвращения одновременной записи.
ProjectID: abcd Lock: False Ресурсы: [{Ресурс: CPU AvailableQuota: 50 UsedQuota: 35}, {Ресурс: StaticIps AvailableQuota: 70 UsedQuota: 45}]
Я думал о том, чтобы поместить его в базу данных MySQL, но не могу придумать подходящий способ вставить список, чтобы мы могли заблокировать поле "ProjectId".
Любые указатели на базу данных/хранилище данных, которые позволяют эту форму размещения вложенных данных?
В 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;
Когда вы используете эти так называемые блокирующие чтения в транзакции таким образом, другие клиенты MySQL будут ждать, пока вы не выполните операцию фиксации.
Избегайте таблиц MyISAM для этого; они не поддерживают транзакции.