Passwd: Kumar@123Double Ledger Banking System
Transaction-Safe Banking Backend
Full-stack banking platform built with Spring Boot and React, focused on transaction correctness, double-entry accounting, concurrency safety, idempotent payments, security, and auditability.
Credentials for authorized evaluation.
These are non-production test accounts. Customer registration and account opening still follow the bank onboarding workflow.
Passwd: Gaurav@123Double Ledger models money movement as immutable ledger entries where account balance is derived from transaction history rather than stored as the primary truth.
Banking workflows must remain correct under retries, concurrency, and partial failures. The system is engineered for consistency, idempotency, and auditable security boundaries.
How the system holds together.
Core engineering
Every transfer creates DEBIT + CREDIT entries tied to one transaction reference. Transaction -> Ledger Entries -> Derived Balance keeps accounting traceable and deterministic.
Concurrency and idempotency
Deterministic ascending account lock order with pessimistic locking reduces deadlocks while persisted idempotency state and keys make UPI retries safe.
Security and auditability
Short-lived JWT + refresh-token rotation stored hashed, RBAC across five roles, sender ownership/KYC checks, audit logging, access logs, and session controls enforce trust boundaries.
System surfaces.








Why I made these decisions.
Why double-entry ledger?
An immutable debit-credit ledger provides traceability, reconciliation, and correctness under complex transaction flows.
Why deterministic pessimistic locking?
Locking shared accounts in ascending ID order reduces deadlock risk during concurrent transfer execution.
Why idempotent UPI processing?
Persisted idempotency state ensures retried payment requests return the same result without duplicate debits.
Focused on business correctness across transfer validation, authorization, retries, and concurrency-sensitive flows with API-driven verification.
Frontend on Vercel, backend on Render, PostgreSQL on Neon, and CI/CD via GitHub Actions with Dockerized delivery steps.
Lessons that travel.
- Balance should be derived from ledger truth.
- Concurrency safety must be designed explicitly.
- Idempotency is mandatory for retryable financial actions.