🔒
Data Access

Transactions

@Transactional
💡 Transaction ek ATM WITHDRAWAL hai — paisa account se KATTA hai AUR cash MACHINE se NIKALTA hai, DONO steps EK SAATH successful hone chahiye. Agar beech mein POWER CUT ho jaaye (exception), poori operation ROLLBACK honi chahiye — sirf paisa KATE, cash na nikले, aisa NAHI ho sakta.

@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
    }
}
🔒
Transaction ek ATM WITHDRAWAL hai — paisa account se KATTA hai AUR cash MACHINE se NIKALTA hai, DONO steps EK SAATH successful hone chahiye. Agar beech mein POWER CUT ho jaaye (exception), poori operation ROLLBACK honi chahiye — sirf paisa KATE, cash na nikले, aisa NAHI ho sakta.
1 / 6
⚡ झट से Recap
  • @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
इस page में (2 subtopics)

@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));
    }
}
⚠️Common Mistake: Self-invocation gotcha — agar EK class ke andar ek @Transactional method, EK DUSRE method ko this.otherMethod() se call karta hai, transaction proxy BYPASS ho jaata hai, @Transactional IGNORE ho jaata hai.

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