Tất cả các câu lệnh cơ sở dữ liệu được thực thi trong ngữ cảnh của một giao dịch vật lý, ngay cả khi chúng tôi không khai báo rõ ràng các ranh giới giao dịch (BEGIN / COMMIT / ROLLBACK).
Nếu bạn không khai báo ranh giới giao dịch một cách rõ ràng, thì mỗi câu lệnh sẽ phải được thực hiện trong một ( autocommit
chế độ) giao dịch riêng biệt . Điều này thậm chí có thể dẫn đến việc mở và đóng một kết nối cho mỗi câu lệnh trừ khi môi trường của bạn có thể xử lý ràng buộc kết nối trên mỗi luồng.
Khai báo một dịch vụ @Transactional
sẽ cung cấp cho bạn một kết nối trong toàn bộ thời lượng giao dịch và tất cả các câu lệnh sẽ sử dụng kết nối cách ly duy nhất đó. Cách này tốt hơn là không sử dụng các giao dịch rõ ràng ngay từ đầu.
Trên các ứng dụng lớn, bạn có thể có nhiều yêu cầu đồng thời và việc giảm tỷ lệ yêu cầu thu thập kết nối cơ sở dữ liệu chắc chắn sẽ cải thiện hiệu suất ứng dụng tổng thể của bạn.
JPA không thực thi các giao dịch trên các hoạt động đọc. Chỉ viết kết thúc bằng việc đưa ra một ngoại lệ bắt buộc giao dịch trong trường hợp bạn quên bắt đầu ngữ cảnh giao dịch. Tuy nhiên, luôn tốt hơn nếu khai báo ranh giới giao dịch ngay cả đối với các giao dịch chỉ đọc (trong Spring @Transactional
cho phép bạn đánh dấu các giao dịch chỉ đọc, điều này có lợi ích về hiệu suất lớn).