@Transactional (truyền bá = Tuyên truyền. YÊU CẦU)


107

nếu ai đó có thể giải thích chú thích này làm gì và khi nào chính xác thì chúng tôi sử dụng nó:

@Transactional(propagation=Propagation.REQUIRED)

Cảm ơn



3
Tuyên truyền.REQUIRED là chế độ truyền tải mặc định của Giao dịch, vì vậy bạn không cần phải đặt nó một cách rõ ràng.
tibtof

Câu trả lời:


65

Khi cài đặt truyền là PROPAGATION_REQUIRED, một phạm vi giao dịch hợp lý được tạo cho mỗi phương pháp mà cài đặt được áp dụng. Mỗi phạm vi giao dịch logic như vậy có thể xác định trạng thái chỉ khôi phục một cách riêng lẻ, với phạm vi giao dịch bên ngoài độc lập về mặt logic với phạm vi giao dịch bên trong. Tất nhiên, trong trường hợp hành vi PROPAGATION_REQUIRED tiêu chuẩn, tất cả các phạm vi này sẽ được ánh xạ tới cùng một giao dịch vật lý. Vì vậy, một điểm đánh dấu chỉ khôi phục được đặt trong phạm vi giao dịch bên trong ảnh hưởng đến cơ hội thực sự cam kết của giao dịch bên ngoài (như bạn mong đợi).

nhập mô tả hình ảnh ở đây

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html


166

Nếu bạn cần một lời giải thích của giáo dân về việc sử dụng ngoài phạm vi được cung cấp trong Tài liệu mùa xuân

Hãy xem xét mã này ...

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

Khi doSomething () được gọi, nó biết rằng nó phải bắt đầu một Giao dịch trên cơ sở dữ liệu trước khi thực thi. Nếu người gọi phương thức này đã bắt đầu một Giao dịch thì phương thức này sẽ sử dụng cùng một Giao dịch vật lý đó trên kết nối cơ sở dữ liệu hiện tại.

@TransactionalChú thích này cung cấp một phương tiện thông báo cho mã của bạn khi mã thực thi rằng nó phải có Giao dịch. Nó sẽ không chạy mà không có một, vì vậy bạn có thể đưa ra giả định này trong mã của mình rằng bạn sẽ không bị bỏ lại dữ liệu không đầy đủ trong cơ sở dữ liệu của mình hoặc phải dọn dẹp thứ gì đó nếu một ngoại lệ xảy ra.

Quản lý giao dịch là một chủ đề khá phức tạp nên hy vọng câu trả lời đơn giản này sẽ hữu ích



nếu nó sử dụng cấu hình dựa trên proxy để khai báo và truy cập vào lớp DAO, thì phương thức trong lớp DAO cũng phải được chú thích bằng @Transactional.
Kurapika

Nếu bạn đã thêm vào @Transactionallớp dịch vụ của mình, không có yêu cầu nào khác để thêm @Transactionalvào các phương thức DAO đang được gọi trong giao dịch đó.
Brad

nếu doSomething()gọi một phương thức lồng nhau khác mà không có bất kỳ @transactional nào thì giao dịch tương tự này cũng sẽ áp dụng cho phương thức gọi đó?
thisarattr

Có, miễn là cùng một Chủ đề đang được sử dụng để thực thi một phương thức lồng nhau (nghĩa là bạn không tạo một Chủ đề mới một cách rõ ràng). Điều này là do các giao dịch mùa xuân được ràng buộc với Chủ đề hiện tại bằng cách sử dụng các biến ThreadLocal
Brad

15

Trong các ứng dụng Spring, nếu bạn bật hỗ trợ giao dịch dựa trên chú thích bằng cách sử dụng <tx:annotation-driven/>và chú thích bất kỳ lớp / phương thức nào với @Transactional (tuyên truyền = Tuyên truyền.REQUIRED) . Nếu bất kỳ RuntimeException nào xảy ra thì giao dịch sẽ được khôi phục.

Trên thực tế, mức độ lan truyền = Spreadation.REQUIRED là mức độ lan truyền mặc định, bạn không cần phải đề cập rõ ràng về nó.

Để biết thêm thông tin: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-decl Compare-annotations


5

Để hiểu các cài đặt và hành vi giao dịch khác nhau được áp dụng cho quản lý Giao dịch, chẳng hạn như REQUIRED,ISOLATION v.v. bạn sẽ phải hiểu những điều cơ bản về quản lý giao dịch.

Đọc quản lý Trasaction để biết thêm về giải thích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.