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
Demonstrates money transfers between accounts using plain JDBC. It fully preserves ACID transaction properties:
- Atomicity: via
conn.setAutoCommit(false)
andconn.commit()
/conn.rollback()
- Consistency: balance validation before transfer
- Isolation:
SELECT ... FOR UPDATE
locks - Durability: writes to the
transaction_log
Implements the same logic, but using Spring:
@Transactional
provides transaction managementJdbcTemplate
simplifies SQL operations
Simulates typical issues in multi-threaded environments:
- 🔴 Dirty Read
- 🔁 Non-Repeatable Read
- 👻 Phantom Read
- 💥 Lost Update
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();
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
- 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
dev.trela
├── ACIDExample
│ ├── BankTransferACIDDemoPlainJDBC.java
│ └── BankTransferACIDDemoSpringJDBC.java
├── parallelexecutionproblems
│ └── ParallelExecutionSimulationDemo.java
├── config
│ ├── AppConfig.java
│ ├── SpringJDBCConfig.java
│ └── PlainJDBCConfig.java
└── Main.java
- Adding a REST API for transfer operations
- Unit testing using H2 or TestContainers
- Transaction and lock monitoring tools