Tôi có các câu hỏi như sau:
- Sự khác biệt của hai cái này là gì?
- Cả hai điều này có được hỗ trợ bởi tất cả các cơ sở dữ liệu không?
- JPA TransactionManager và JTA TransactionManager có khác nhau không?
Câu trả lời:
Việc triển khai JPA có lựa chọn tự quản lý các giao dịch ( RESOURCE_LOCAL
) hoặc để chúng được quản lý bởi triển khai JTA của máy chủ ứng dụng.
Trong hầu hết các trường hợp, RESOURCE_LOCAL là tốt. Điều này sẽ sử dụng các giao dịch cấp JDBC cơ bản. Nhược điểm là giao dịch là cục bộ đối với đơn vị lâu dài JPA, vì vậy nếu bạn muốn một giao dịch kéo dài nhiều đơn vị lâu dài (hoặc cơ sở dữ liệu khác), thì RESOURCE_LOCAL có thể không đủ tốt.
JTA cũng được sử dụng để quản lý các giao dịch trên các hệ thống như JMS và JCA, nhưng đó là cách sử dụng khá kỳ lạ đối với hầu hết chúng ta.
Để sử dụng JTA, bạn cần hỗ trợ cho nó trong máy chủ ứng dụng của mình và cả hỗ trợ từ trình điều khiển JDBC.
Như một phần bổ sung cho các câu trả lời khác
Đây là một đoạn trích từ bài viết cực kỳ hữu ích (được đăng trên trang web Apache TomEE ), cũng có thể giúp trả lời câu hỏi đầu tiên của OP (liên kết đến bài viết ở bên dưới).
So sánh ngữ cảnh liên tục RESOURCE_LOCAL và JTA
Với <Persistence-unit transaction-type = "RESOURCE_LOCAL"> BẠN chịu trách nhiệm cho EntityManager (PersistenceContext / Cache) tạo và theo dõi ...
- Bạn phải sử dụng EntityManagerFactory để có được EntityManager
- Cá thể EntityManager kết quả là một PersistenceContext / Cache
- Một EntityManagerFactory chỉ có thể được đưa vào thông qua chú thích @PersistenceUnit (không phải @PersistenceContext)
- Bạn không được phép sử dụng @PersistenceContext để chỉ đơn vị thuộc loại RESOURCE_LOCAL
- Bạn phải sử dụng API EntityTransaction để bắt đầu / cam kết mọi lệnh gọi tới EntityManger của bạn
- Việc gọi entityManagerFactory.createEntityManager () hai lần dẫn đến hai trường hợp EntityManager riêng biệt và cho hai PersistenceContexts / Caches riêng biệt.
- Đó là hầu như không bao giờ là một ý tưởng tốt để có nhiều hơn một ví dụ của một EntityManager sử dụng (không tạo ra một thứ hai, trừ khi bạn đã phá hủy đầu tiên)
Với <kiên trì đơn vị giao dịch type = "JTA"> các CONTAINER sẽ làm EntityManager (PersistenceContext / Cache) tạo và theo dõi ...
- Bạn không thể sử dụng EntityManagerFactory để nhận EntityManager
- Bạn chỉ có thể nhận được EntityManager do vùng chứa cung cấp
- Một EntityManager chỉ có thể được đưa vào thông qua chú thích @PersistenceContext (không phải @PersistenceUnit)
- Bạn không được phép sử dụng @PersistenceUnit để chỉ một đơn vị thuộc loại JTA
- Các EntityManager đưa ra bởi các container là một tài liệu tham khảo cho PersistenceContext / Cache liên kết với một giao dịch JTA.
- Nếu không có giao dịch JTA nào đang diễn ra, EntityManager không thể được sử dụng vì không có PersistenceContext / Cache.
- Mọi người có tham chiếu EntityManager đến cùng một đơn vị trong cùng một giao dịch sẽ tự động có tham chiếu đến cùng một PersistenceContext / Cache
- Các PersistenceContext / Cache là đỏ mặt và được thông quan tại JTA cam kết thời gian
Bất kỳ ai quan tâm đến việc tìm hiểu Java Persistence API - hãy tự giúp mình và đọc toàn bộ bài viết tại đây: Các khái niệm JPA: JPA 101 .
transaction-type=RESOURCE_LOCAL
và @PersistenceContext
và @Transactional
bởi Spring quản lý
Resource_Local và JTA là các trình quản lý giao dịch (các phương thức thực hiện giao dịch). Đây không phải là thuộc tính của cơ sở dữ liệu mà là thành phần chịu trách nhiệm điều phối các giao dịch. Người quản lý giao dịch JPA và JTA khác nhau. Người quản lý giao dịch JPA chịu trách nhiệm về các giao dịch JPA và bạn muốn sử dụng một người quản lý nếu bạn chỉ thực hiện giao dịch JPA. Người quản lý giao dịch JTA là người quản lý giao dịch mục đích chung và có thể tranh thủ các tài nguyên khác như hàng đợi JMS trong giao dịch. Thông thường, các vùng chứa Java EE sử dụng trình quản lý giao dịch JTA cho các EJB, các thực thể JPA, v.v.
resource_local so với JTA về giao dịch địa phương so với giao dịch toàn cầu. Đó là về việc chúng ta có thể quản lý nhiều tài nguyên trong một giao dịch duy nhất.
CMT so với BMT nói về ai đang mở và đóng giao dịch - nhà phát triển ứng dụng hoặc máy chủ ứng dụng.