2012-09-28 31 views
15

Khi sử dụng JdbcTemplate, tôi có cần định cấu hình giao dịch một cách rõ ràng không?JdbcTemplate và Giao dịch của Spring

bố trí Mã của tôi trông giống như sau:

tôi sẽ có một UserDao sẽ được tiêm vào UserService của tôi, và sau đó điều khiển của tôi sẽ thực hiện cuộc gọi trên phương pháp trong UserService tôi.

Tôi muốn giữ mọi thứ đơn giản như giao dịch có thể khôn ngoan và tôi không cần nhiều lệnh gọi cơ sở dữ liệu để mở rộng giao dịch.

Theo mặc định, tôi có phải làm gì trong tệp cấu hình của mình hoặc sử dụng chú thích @Transaction ở bất kỳ đâu không?

Bây giờ hãy nói trong bộ điều khiển của tôi, tôi cần thực hiện 2 cuộc gọi trên userService và accountService của mình, tôi có thể bọc nó một cách rõ ràng trong giao dịch bằng cách nào đó không?

userService.updateUser(user); 
accountService.updateXXX(...); 

Trả lời

21

Có, JdbcTemplate không thay thế cho quản lý giao dịch. Bạn vẫn được hưởng lợi từ giao dịch cơ sở dữ liệu, vì vậy userService.updateUser sẽ hoạt động trong một giao dịch cơ sở dữ liệu, nhưng nếu accountService.updateXXX không thành công, userService.updateUser sẽ không rollback.

Nếu bạn không muốn sử dụng AOP, bạn có thể sử dụng TransactionTemplate để thay thế. Xem programmatic transaction management trong Spring Reference Documentation.

Một mẫu mà tôi đã thấy trước đây là cho lớp điều khiển MVC để gọi một dịch vụ nghiệp vụ, gói này sẽ đóng gói hoạt động. Phương pháp của lớp doanh nghiệp sau đó có thể được chú thích @Transactional.

+1

wow, đó là phân bổ mã cho một giao dịch, @Transactional chắc chắn làm cho nó ít sôi nổi hơn để viết! – loyalflow

+0

Đó là, nhưng nó khá hữu ích nếu bạn cần truy cập vào 'TransactionStatus'. –

+1

+1 cho ý tưởng dịch vụ kinh doanh. IMHO, cuộc sống sẽ dễ dàng hơn nếu mọi người làm điều này. – xdhmoore

9

Nếu bộ điều khiển của bạn muốn thực hiện một số việc với người dùng và tài khoản và có tất cả những gì xảy ra trong một giao dịch, thì bạn nên có một dịch vụ với một phương pháp thực hiện tất cả những thứ đó. Tạo một dịch vụ cho mỗi DAO không phải là một ý tưởng tuyệt vời, bởi vì bạn kết thúc với các trình bao bọc không có gì xung quanh DAO và việc xử lý sẽ chậm vì cơ sở dữ liệu sẽ phải tạo một giao dịch riêng cho mỗi cuộc gọi tới DAO, nhiều công việc hơn là cần phải làm.

Dịch vụ phải cung cấp chức năng cho bộ điều khiển hoặc bất kỳ ai khác đang gọi nó. Tôi cố gắng tạo các dịch vụ với ý tưởng rằng dịch vụ cung cấp các chức năng cụ thể hữu ích cho một loại người dùng nhất định.

+1

+1 seconded. Điều này làm cho nhiều thứ trở nên dễ dàng hơn, bao gồm thử nghiệm và làm cho nó dễ dàng nếu bạn cần để lộ bất kỳ chức năng nào cho một chế độ xem khác ngoài bộ điều khiển (ví dụ: API REST). – xdhmoore

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