2017-12-21 9 views
0

데이터베이스에 다음 구조를 저장하는 방법이 필요합니다. 컨텍스트는 리소스 목록을 포함하는 테이블을 가지고 있으며 동시 쓰기를 방지하기 위해 작업을 수행 할 때이 테이블을 잠글 수 있어야합니다.사전 목록을 저장할 데이터베이스

ProjectID : ABCD 자물쇠 거짓 리소스 [ { 자원 : CPU AvailableQuota 50 USEDQUOTA 35 }, { 리소스 : StaticIps AvailableQuota 70 USEDQUOTA 45 } ]

나는 그것을 MySQL 데이터베이스에 넣을 생각을했지만 적절한 방법으로 목록을 중첩 할 수 없으므로 'ProjectId'필드를 잠글 수 있습니다.

이 형식의 데이터 구조 중첩을 허용하는 데이터베이스/데이터 저장소에 대한 모든 포인터는 무엇입니까?

답변

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; 

을 수행 할 수 있습니다, 당신은 이런 종류의 작업을 수행 할 수 있습니다. 당신이이 so-called Locking Reads in a transaction이 방법을 사용하면 당신이 커밋 작업을 실행할 때까지

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 테이블을 사용하지 마십시오. 그들은 트랜잭션을 지원하지 않습니다.

+0

이 답변의 품질에 놀랐습니다. 고마워, 내 사용 사례를 채우는 것 같다! – user3325789