Transactions
@Transactional annotation ek method (ya class) ko TRANSACTIONAL BOUNDARY mark karta hai — method SHURU hote hi transaction START hoti hai, method SUCCESSFULLY complete hone par COMMIT (changes PERMANENT), aur RUNTIME EXCEPTION aane par AUTOMATIC ROLLBACK (saare changes UNDO).
Ye Spring AOP (proxy-based mechanism) se implement hota hai — Spring @Transactional method ke AROUND ek PROXY banata hai jo transaction management HANDLE karta hai. Isse ek IMPORTANT gotcha aata hai — SAME CLASS ke andar self-invocation (this.method()) proxy ko BYPASS kar deta hai, @Transactional EFFECTIVE nahi hota.
@Service
public class OrderService {
private final InventoryService inventory;
private final PaymentService payment;
private final OrderRepository orderRepo;
@Transactional
public Order placeOrder(OrderDto dto) {
inventory.reduceStock(dto.getItems()); // step 1
payment.charge(dto.getAmount()); // step 2 — agar YE fail ho...
return orderRepo.save(new Order(dto)); // ...to step 1 bhi ROLLBACK ho jaayega
}
}- @Transactional = method ke around START/COMMIT/ROLLBACK boundary
- AOP proxy-based — self-invocation (this.method()) BYPASS kar deta hai
- Default: sirf RuntimeException par automatic rollback
@Transactional Spring AOP (proxy-based) se implement hota hai — method call se PEHLE transaction START hoti hai, method SUCCESSFULLY complete hone par COMMIT, aur exception aane par ROLLBACK. Ye PROXY mechanism ki wajah se, @Transactional method ko SAME CLASS ke andar se call karna (self-invocation) transaction TRIGGER NAHI karta — ye ek COMMON gotcha hai.
@Service
public class OrderService {
@Transactional
public void placeOrder(OrderDto dto) {
inventoryService.reduceStock(dto); // agar ye fail ho...
paymentService.charge(dto); // ...to ye bhi ROLLBACK ho jaayega
orderRepository.save(mapToOrder(dto));
}
}Propagation batata hai — agar EK transactional method DUSRE transactional method ko call kare, KYA HONA CHAHIYE? REQUIRED (default, existing transaction join karo ya NAYI banaओ), REQUIRES_NEW (HAMESHA nayi transaction, independent). Isolation level CONCURRENT transactions ke beech VISIBILITY control karta hai (READ_COMMITTED common default hai).
- REQUIRED (default) = existing transaction join, ya nayi banaओ
- REQUIRES_NEW = hamesha ek NAYI, independent transaction
- Isolation = concurrent transactions ke beech data visibility rules