자금 zero tolerance — rpl_semi_sync_master_wait_point=AFTER_SYNC
auditdb
semi-sync (loseless)
audit defense — 1 row 손실 critical
approverdb
semi-sync 권장
governance evidence
walletdb
async OK (semi-sync 권장)
metadata
chaindb
async OK
chain 자체에 있음 — re-fetch 가능
providerdb
async OK
provider 에서 re-ingest 가능
recondb
async OK
reconciliation 자체가 evidence
필수 설정
자금 / 감사 DB 는 loseless semi-sync + innodb_flush_log_at_trx_commit=1 + sync_binlog=1 조합 필요.
Outbox Pattern (cross-DB consistency)
Multi-DB transaction 불가능 → outbox 로 eventual consistency.
-- ledgerdb 의 한 transaction 안에서
START TRANSACTION;
-- 1. business operation
INSERT INTO ledger_entries (...) VALUES (...);
-- 2. outbox row (같은 DB transaction)
INSERT INTO outbox (id, target_db, target_aggregate, payload_cbor, created_at, ...)
VALUES (UUID_TO_BIN(UUID(), 1), 'auditdb', 'audit_events', ?, NOW(6), ...);
COMMIT;
-- 별도 worker:
-- outbox row 를 target DB 로 idempotent replicate
-- INSERT ... ON DUPLICATE KEY UPDATE id=id (no-op merge)
Idempotency SQL Pattern
-- 1. INSERT IGNORE 로 중복 시 무시 (reference_id 는 UNIQUE)
INSERT IGNORE INTO withdrawals (id, reference_id, ...)
VALUES (UUID_TO_BIN(UUID(), 1), ?, ...);
-- 2. 항상 같은 row 를 반환 (신규 / 기존 무관)
SELECT id FROM withdrawals WHERE reference_id = ? LIMIT 1;
-- 단일 transaction 안에서 두 쿼리 모두 실행하면
-- "first writer wins, 이후는 동일 row 반환" 보장 (reference_id UNIQUE 전제).