2012-02-13 49 views
5

Tôi tìm thấy thread sau: How exactly JdbcTemplate with TransactionManager works together?Trình quản lý giao dịch Spring có ràng buộc kết nối với một luồng không?

Câu đầu tiên của rằng:

Theo như tôi hiểu DataSourceTransactionManager liên kết với một kết nối JDBC từ DataSource quy định để xử lí hiện tại, cho phép một thread-bound Kết nối cho mỗi nguồn dữ liệu. Nếu đó là một nhóm các kết nối, nó sẽ có một trong các kết nối có sẵn.

... chính xác là những gì tôi muốn biết.

Khi sử dụng trình quản lý giao dịch, bạn có kết thúc với từng chuỗi có kết nối đơn riêng không? Ngoài ra, kết nối đó tồn tại bao lâu? Liệu cùng một luồng có sử dụng cùng một kết nối trong suốt một yêu cầu hay không, hoặc có cái gì khác đang diễn ra không? Tôi chỉ đang cố gắng hiểu chính xác Spring đang làm gì bên dưới khi bạn có một người quản lý giao dịch và khi bạn không (bất kể bạn có thực sự có giao dịch hay không).

Trả lời

10

Khi sử dụng trình quản lý giao dịch, bạn có kết thúc với từng chuỗi có kết nối đơn riêng không? Ngoài ra, kết nối đó tồn tại bao lâu?

Kết nối thường thu được từ một hồ bơi kết nối. Kết nối được mượn từ hồ bơi khi người quản lý giao dịch bắt đầu giao dịch và sau đó quay lại hồ bơi khi giao dịch kết thúc. Trong thời gian đó, kết nối bị ràng buộc vào luồng.

Liệu các chủ đề cùng sử dụng cùng một kết nối trong suốt một yêu cầu duy nhất

Nó sử dụng cùng một kết nối trong suốt thời gian giao dịch. Bản thân yêu cầu không liên quan.

không phân biệt hay không, bạn thực sự có một giao dịch

Bạn luôn có một giao dịch, cho dù bạn làm điều đó một cách rõ ràng hay không. Nếu bạn không cấu hình một cách rõ ràng, thì trình điều khiển và cơ sở dữ liệu JDBC sẽ bắt đầu và kết thúc một cho đến khi nào nó thực hiện thao tác đơn lẻ. Quản lý giao dịch của Spring (hoặc bất kỳ quản lý giao dịch nào của khung công tác khác) cho phép bạn kéo dài tuổi thọ của giao dịch đó qua nhiều hoạt động. Làm như vậy yêu cầu sử dụng độc quyền kết nối trong suốt thời gian giao dịch.

+0

Cảm ơn bạn đã phản hồi. Nó giúp tôi hiểu thêm một chút về những gì đang xảy ra. Tôi hiểu cách quản lý giao dịch cho phép giao dịch mở rộng cho nhiều hoạt động. Tuy nhiên, trong trường hợp của tôi, tôi có @Transactional (propagation = Propagation.SUPPORTS) trên mỗi phương thức DAO của tôi, nghĩa là mỗi cuộc gọi sẽ sử dụng giao dịch độc lập của riêng nó. Sau khi người quản lý nhận được một kết nối ban đầu từ các hồ bơi hiện nó sau đó ràng buộc rằng kết nối đến các chủ đề hiện tại, và sau đó lấy nó từ đó cho cuộc đời của chủ đề, thay vì quay trở lại hồ bơi để có được một kết nối? – dnc253

+0

"mỗi cuộc gọi sẽ sử dụng giao dịch độc lập riêng" - điều này không đúng. DAO của bạn sẽ "kế thừa" bất kỳ giao dịch hiện tại nào đã bị ràng buộc vào luồng. nó sẽ không bắt đầu một cái mới trừ khi không có cái nào bị ràng buộc. – skaffman

+1

Tôi đoán cách tôi định nghĩa "giao dịch" không hoàn toàn chính xác.Cách tôi đã hiểu một giao dịch là khi bạn có một hoạt động DB đơn (có thể có bất kỳ số lượng cập nhật, chèn, vv) Tất cả xảy ra hoặc không có điều gì xảy ra. Cách DAO được thiết lập, mỗi phương thức sẽ hoạt động trên DB độc lập với các phương thức khác. Nếu một phương pháp thất bại, nó sẽ không ảnh hưởng đến những hoạt động nào được thực hiện bởi các phương thức khác trước hoặc sau khi phương thức thất bại. Vậy, chính xác thì "giao dịch" là gì? Tôi đã nghĩ rằng mỗi phương pháp sẽ tạo ra giao dịch mới của riêng nó, nhưng rõ ràng đó không phải là trường hợp? – dnc253

Các vấn đề liên quan