Phạm vi giao dịch khai báo
Cả @Transaction
chú thích Spring và JPA đều cho phép bạn xác định phạm vi của một giao dịch ứng dụng nhất định.
Vì vậy, nếu một phương thức dịch vụ được chú thích bằng @Transactional
chú thích, nó sẽ chạy trong ngữ cảnh giao dịch. Nếu phương thức dịch vụ sử dụng nhiều DAO hoặc Kho lưu trữ, tất cả các thao tác đọc và ghi sẽ được thực hiện trong cùng một giao dịch cơ sở dữ liệu.
Mùa xuân @Transactional
Các org.springframework.transaction.annotation.Transactional
chú thích đã có sẵn từ phiên bản 1.2 của Spring framework (khoảng năm 2005), và nó cho phép bạn thiết lập các thuộc tính giao dịch sau:
isolation
: mức cô lập cơ sở dữ liệu cơ bản
noRollbackFor
và noRollbackForClassName
: danh sách các Exception
lớp Java có thể được kích hoạt mà không kích hoạt việc khôi phục giao dịch
rollbackFor
và rollbackForClassName
: danh sách các Exception
lớp Java kích hoạt một giao dịch khôi phục khi được ném
propagation
: kiểu truyền giao dịch do Propagation
Enum đưa ra . Ví dụ: nếu ngữ cảnh giao dịch có thể được kế thừa (ví dụ, REQUIRED
) hoặc một ngữ cảnh giao dịch mới nên được tạo (ví dụ REQUIRES_NEW
:) hoặc nếu một ngoại lệ nên được ném nếu không có bối cảnh giao dịch nào (ví dụ, MANDATORY
) hoặc nếu một ngoại lệ nên được ném nếu bối cảnh giao dịch hiện tại được tìm thấy (ví dụ NOT_SUPPORTED
:).
readOnly
: liệu giao dịch hiện tại chỉ nên đọc dữ liệu mà không áp dụng bất kỳ thay đổi nào.
timeout
: ngữ cảnh giao dịch sẽ được phép chạy trong bao nhiêu giây cho đến khi một ngoại lệ thời gian chờ được đưa ra.
value
hoặc transactionManager
: tên của Spring TransactionManager
bean sẽ được sử dụng khi ràng buộc ngữ cảnh giao dịch.
Java EE @Transactional
Các javax.transaction.Transactional
chú thích đã được bổ sung bởi các đặc điểm kỹ thuật Java EE 7 (khoảng năm 2013). Vì vậy, chú thích Java EE được thêm vào muộn hơn 8 năm so với phiên bản Spring của nó.
Java EE @Transactional
chỉ định nghĩa 3 thuộc tính:
dontRollbackOn
: danh sách các Exception
lớp Java có thể được kích hoạt mà không kích hoạt việc khôi phục giao dịch
rollbackOn
: danh sách các Exception
lớp Java kích hoạt một giao dịch khôi phục khi được ném
value
: chiến lược truyền bá, được đưa ra bởi TxType
Enum. Ví dụ: nếu ngữ cảnh giao dịch có thể được kế thừa (ví dụ REQUIRED
:) hoặc một ngữ cảnh giao dịch mới nên được tạo (ví dụ REQUIRES_NEW
:) hoặc nếu một ngoại lệ nên được ném nếu không có ngữ cảnh giao dịch nào (ví dụ, MANDATORY
) hoặc nếu một ngoại lệ nên được ném nếu bối cảnh giao dịch hiện tại được tìm thấy (ví dụ NOT_SUPPORTED
:).
Chọn cái nào?
Nếu bạn đang sử dụng Spring hoặc Spring Boot, hãy sử dụng @Transactional
chú thích Spring , vì nó cho phép bạn định cấu hình nhiều thuộc tính hơn so với @Transactional
chú thích Java EE .
Nếu bạn đang sử dụng Java EE một mình và bạn triển khai ứng dụng của mình trên máy chủ ứng dụng Java EE, thì hãy sử dụng @Transactional
chú thích Java EE .
Để biết thêm chi tiết về cấu hình mức cô lập khác nhau như thế nào khi sử dụng các @Transactional
định nghĩa Spring hoặc Java EE , hãy xem bài viết này .
javax.transaction.Transactional
để giờ đây người ta có thể sử dụng nó trong các ứng dụng Spring mà không cần bất kỳ hành động bổ sung nào. IMO, đây là một quyết định khá tồi từ quan điểm thiết kế , vì theo kinh nghiệm của tôi, rất nhiều nhà phát triển đã nhầm lẫn hai điều này một cách vô ý thức trong mã của họ, dẫn đến các vấn đề sau đó.