[DB]軍の取引とされる-2コンシステンシ編


1.一貫性とは?


コンシステンシの事前定義は次のとおりです.

  • 一貫性とは、トランザクションが正常に実行されると、常に一貫したデータベース・ステータスが維持されることを意味します.整合性制約がすべての勘定科目に残高を要求する場合、その制限に違反する取引は中断されます.(ソース)

  • インターネット上でトランザクションの一貫性を検索すると、送金の例が表示されます.
    Aの残高+Bの残高=100万元の場合、送金後Aの残高+Bの残高=100万元となります.

  • また、トランザクションの一貫性は、データベースが持つ制約にも依存します(たとえば、残高はゼロ未満ではなく、残高は常に数値でなければなりません).
  • 2.取引が一致しない場合


    前の例を引き続き使用します.しかし、今回入隊を申請した場合、軍は10000ウォンを支給する.データベースに問題が発生したため、送金トランザクションの原子性は保護されません.
    class MilitaryDB{
        HashSet<String> newSoldiers = new HashSet<>();
        int budget = 10_000;
    
        public void 입대(Citizen citizen) {
            newSoldiers.add(citizen.name);
            송금(citizen);
        }
    
        public void 송금(Citizen citizen) {
            budget -= 10_000;
            if(네트워크_에러_발생()) {
                System.out.println("=====Network Failure=====");
            } else {
                citizen.balance += 10_000;
            }
        }
    
        private boolean 네트워크_에러_발생() {
            if(2*Math.random() > 1) 
                return true;
            else 
                return false;
            
        }
    
        public void 국가의_부름에_답하라() {
            for (String name : newSoldiers) {
                System.out.println("2022년 3월 23일까지 논산훈련소로 오도록, 훈련병 " + name);
            }
        }
    }
    
    class Citizen {
        String name;
        int balance;
    
        public Citizen(String name, int balance) {
            this.name = name;
            this.balance = balance;
        }
    }

    上記の状況が発生した場合、一致しないと言う可能性があります.
    これにより、トランザクションの原子間性が使用できない場合、トランザクションの一貫性も使用できません.