REQUIRES_NEW luôn mở một physical transaction độc lập: connection riêng, có thể tự khai báo isolation/timeout/readOnly, commit hoặc rollback không liên quan tới transaction ngoài. Transaction ngoài bị treo (suspend) trong lúc đó.
NESTED dùng một physical transaction duy nhất với savepoint. Phần bên trong rollback thì chỉ quay về savepoint, transaction ngoài vẫn chạy tiếp và commit toàn bộ ở cuối. Cơ chế này map xuống JDBC savepoint, nên chỉ chạy với transaction JDBC — JPA/Hibernate không hỗ trợ đầy đủ.
| REQUIRES_NEW | NESTED | |
|---|---|---|
| Connection | thêm một connection | dùng lại connection hiện tại |
| Commit độc lập | có | không (cùng commit với ngoài) |
| Rollback trong | không ảnh hưởng ngoài | quay về savepoint |
Rủi ro của REQUIRES_NEW: mỗi lần lồng chiếm thêm một connection từ pool trong khi transaction ngoài vẫn đang giữ connection của nó. Pool nhỏ hơn số thread đồng thời + 1 sẽ dẫn tới cạn pool và deadlock: thread nào cũng giữ một connection và chờ connection thứ hai. Ngoài ra, transaction ngoài không thấy dữ liệu transaction trong chưa commit, và hai transaction có thể khóa lẫn nhau trên cùng một hàng.
Dùng REQUIRES_NEW cho việc thật sự cần độc lập (ghi log audit, đánh dấu đã xử lý message), không dùng như một cách chữa cháy lỗi rollback-only.