Skip to content

Trela-dev/banking-acid-simulation

Repository files navigation

💸 ACID Transactions & Concurrency Simulation in Java

This project demonstrates the ACID properties of database transactions in practice using two approaches:

  • Plain JDBC
  • Spring JDBC (JdbcTemplate, @Transactional)

Additionally, the project simulates common concurrency issues in databases, such as:

  • Dirty Read
  • Non-Repeatable Read
  • Phantom Read
  • Lost Update

🏗️ Project Structure

1. BankTransferACIDDemoPlainJDBC

Demonstrates money transfers between accounts using plain JDBC. It fully preserves ACID transaction properties:

  • Atomicity: via conn.setAutoCommit(false) and conn.commit()/conn.rollback()
  • Consistency: balance validation before transfer
  • Isolation: SELECT ... FOR UPDATE locks
  • Durability: writes to the transaction_log

2. BankTransferACIDDemoSpringJDBC

Implements the same logic, but using Spring:

  • @Transactional provides transaction management
  • JdbcTemplate simplifies SQL operations

3. ParallelExecutionSimulationDemo

Simulates typical issues in multi-threaded environments:

  • 🔴 Dirty Read
  • 🔁 Non-Repeatable Read
  • 👻 Phantom Read
  • 💥 Lost Update

🧪 How to Run

Requirements:

  • Java 17+
  • PostgreSQL
  • Maven

Database configuration (PostgreSQL):

  • Database name: testdb
  • Username: admin, Password: admin
  • Tables:
    • accounts(account_id, name, balance)
    • transaction_log(account_from, account_to, amount, status)
  • Flyway migrates the schema at startup (located in resources/db/migration)

To run:

In Main.java, you can activate specific tests, for example:

BankTransferACIDDemoPlainJDBC.testConcurrentTransfers();
parallelExecutionSimulationDemo.demonstratePhantomRead();

📋 Sample Console Output

Transaction 1 Pending  
Transaction 2 Pending  
Transaction 3 Pending  
Transaction 1 completed  
Transaction 2 completed  
Transaction 3 completed  
Account 1: 870.00 PLN  
Account 2: 1130.00 PLN

🧠 Conclusions

  • ACID properties are crucial in banking and financial systems
  • Spring simplifies transaction management, but isolation levels must be chosen consciously
  • The simulations show how faulty reads can lead to data inconsistencies

📂 Directory Structure

dev.trela
├── ACIDExample
│   ├── BankTransferACIDDemoPlainJDBC.java
│   └── BankTransferACIDDemoSpringJDBC.java
├── parallelexecutionproblems
│   └── ParallelExecutionSimulationDemo.java
├── config
│   ├── AppConfig.java
│   ├── SpringJDBCConfig.java
│   └── PlainJDBCConfig.java
└── Main.java

🛠️ Future Enhancements

  • Adding a REST API for transfer operations
  • Unit testing using H2 or TestContainers
  • Transaction and lock monitoring tools

About

ACID and concurrency Problems simulation.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages