sách gpt4 ai đã đi

Giải quyết vấn đề chú thích @Transactional transaction không quay lại và không hoạt động

In lại Tác giả:qq735679552 Thời gian cập nhật: 2022-09-29 22:32:09 28 4
mua khóa gpt4 Nike

CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.

Bài đăng trên blog CFSDN này giải quyết vấn đề giao dịch chú thích @Transactional không quay lại và không hoạt động. Bài đăng được tác giả thu thập và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.

Gần đây, tôi phát hiện trong dự án rằng sau khi tôi sử dụng @Transactional để chú thích giao dịch, ngoại lệ đã được đưa ra nhưng không được khôi phục. Cuối cùng tôi đã tìm ra lý do.

Nếu bạn gặp phải trường hợp này, bạn có thể bắt đầu khắc phục sự cố theo cách sau.

1. Tính năng

Trước tiên, chúng ta hãy tìm hiểu các đặc điểm của giao dịch được chú thích @Transactional để có thể khắc phục sự cố tốt hơn.

1. Thêm @Transactional vào thẻ lớp dịch vụ (thường không được khuyến nghị trên giao diện) có thể bao gồm toàn bộ lớp trong quản lý giao dịch mùa xuân. Một giao dịch sẽ được mở khi mỗi phương thức kinh doanh được thực thi, nhưng các giao dịch này được quản lý theo cùng một cách.

2. Chú thích @Transactional chỉ có thể được áp dụng cho các phương thức có khả năng hiển thị công khai. Nếu áp dụng cho phương thức được bảo vệ, riêng tư hoặc khả năng hiển thị gói, sẽ không có lỗi nào được báo cáo, nhưng cài đặt giao dịch sẽ không có hiệu lực.

3. Theo mặc định, Spring sẽ khôi phục giao dịch đối với các ngoại lệ chưa được kiểm tra; nếu đó là ngoại lệ đã được kiểm tra, giao dịch sẽ không khôi phục.

Vậy ngoại lệ đã kiểm tra là gì và ngoại lệ chưa kiểm tra là gì.

Trong Java, các ngoại lệ bắt nguồn từ Error hoặc RuntimeException (chẳng hạn như con trỏ null, 1/0) được gọi là ngoại lệ không được kiểm tra và các ngoại lệ khác được kế thừa từ java.lang.Exception được gọi chung là Ngoại lệ được kiểm tra, chẳng hạn như IOException, TimeoutException, v.v.

Chúng ta hãy nói theo cách đơn giản hơn:

Các ngoại lệ như con trỏ null xuất hiện trong mã của bạn sẽ được khôi phục. Nếu có vấn đề về đọc và ghi tệp hoặc mạng, Spring sẽ không thể khôi phục. Sau đó tôi sẽ hướng dẫn bạn cách ghi nhớ điều này, vì nhiều học viên dễ bị nhầm lẫn. Khi bạn viết code, một số IOException có thể được trình biên dịch của chúng tôi phát hiện, vì vậy chúng được gọi là ngoại lệ đã kiểm tra. Khi bạn viết code, lỗi con trỏ null không thể được phát hiện, vì vậy chúng được gọi là ngoại lệ chưa kiểm tra. Như vậy sẽ dễ nhớ hơn phải không?

4. Giao dịch chỉ đọc:

?
1
@Giao dịch (lan truyền=lan truyền.KHÔNG_HỖ_trợ,chỉ_đọc= ĐÚNG VẬY )

Cờ chỉ đọc chỉ được áp dụng khi giao dịch được bắt đầu, nếu không, cờ này sẽ bị bỏ qua ngay cả khi đã được cấu hình.

Việc bắt đầu một giao dịch sẽ làm tăng chi phí luồng và cơ sở dữ liệu bị khóa khi chia sẻ các lần đọc (tùy thuộc vào loại cơ sở dữ liệu và mức độ cô lập giao dịch). Thông thường, khi chỉ đọc dữ liệu, không cần thiết lập giao dịch chỉ đọc và tăng thêm chi phí hệ thống.

2: Chế độ truyền bá giao dịch

Sự lan truyền liệt kê nhiều chế độ lan truyền giao dịch, một số trong đó được liệt kê dưới đây:

1. BẮT BUỘC (chế độ mặc định): Phương thức kinh doanh cần phải chạy trong một vùng chứa. Nếu phương thức đã có trong một giao dịch khi chạy thì hãy tham gia giao dịch đó, nếu không thì hãy tạo một giao dịch mới.

2. KHÔNG ĐƯỢC HỖ TRỢ: Phương pháp khai báo không yêu cầu giao dịch. Nếu phương thức không được liên kết với giao dịch, container sẽ không mở giao dịch cho phương thức đó. Nếu phương thức được gọi trong giao dịch, giao dịch sẽ bị tạm dừng. Sau khi lệnh gọi hoàn tất, giao dịch gốc sẽ tiếp tục thực hiện.

3. YÊU CẦU MỚI: Bất kể giao dịch có tồn tại hay không, phương pháp này sẽ luôn tự khởi tạo một giao dịch mới. Nếu phương thức này đang chạy trong một giao dịch, giao dịch gốc sẽ bị tạm dừng và một giao dịch mới sẽ được tạo.

4. BẮT BUỘC: Phương pháp này chỉ có thể được thực hiện trong một giao dịch hiện có. Các phương pháp kinh doanh không thể khởi tạo các giao dịch của riêng chúng. Nếu được gọi mà không có giao dịch, container sẽ đưa ra một ngoại lệ.

5. HỖ TRỢ: Nếu phương thức được gọi trong phạm vi của một giao dịch, thì phương thức đó sẽ trở thành một phần của giao dịch. Nếu một phương thức được gọi bên ngoài phạm vi của giao dịch, nó sẽ được thực thi mà không cần giao dịch.

6. KHÔNG BAO GIỜ: Phương pháp này không bao giờ được thực hiện trong phạm vi của một giao dịch. Nếu vậy, hãy đưa ra một ngoại lệ. Phương pháp này chỉ được thực hiện bình thường nếu nó không liên quan đến bất kỳ giao dịch nào.

7. LỒNG NHAU: Nếu một giao dịch đang hoạt động tồn tại, nó sẽ chạy trong một giao dịch lồng nhau. Nếu không có giao dịch nào đang hoạt động, thuộc tính BẮT BUỘC sẽ được sử dụng. Nó sử dụng một giao dịch duy nhất với nhiều điểm lưu có thể được khôi phục. Việc hủy bỏ một giao dịch nội bộ sẽ không ảnh hưởng đến giao dịch bên ngoài. Nó chỉ hoạt động với trình quản lý giao dịch DataSourceTransactionManager.

Ba: Giải quyết vấn đề chú thích giao dịch không quay lại

1. Kiểm tra xem phương thức của bạn có công khai không.

2. Loại ngoại lệ của bạn có phải là ngoại lệ không được kiểm tra không?

Nếu tôi muốn kiểm tra ngoại lệ và cũng muốn khôi phục thì sao? Tôi có thể chỉ cần viết loại ngoại lệ trong chú thích.

?
1
@Giao dịch (rollbackFor=Ngoại lệ. lớp học )

Ngoài ra còn có norollbackFor, tùy chỉnh ngoại lệ không khôi phục.

3. Cơ sở dữ liệu phải hỗ trợ giao dịch. Nếu là MySQL, hãy chú ý đến bảng sử dụng cơ sở dữ liệu hỗ trợ giao dịch, chẳng hạn như innodb. Nếu là myisam, giao dịch sẽ không hoạt động.

4. Có bật chức năng phân tích chú thích hay không.

  .

?
1
"Trình quản lý giao dịch" proxy-mục tiêu- lớp học = "ĐÚNG VẬY" />

5. Kiểm tra xem spring có quét gói của bạn không. Sau đây là gói được quét theo org.test.

?
1
bưu kiện = "tổ chức.kiểm tra" >

6. Kiểm tra xem đó có phải là lệnh gọi phương thức trong cùng một lớp hay không (ví dụ, phương thức a gọi phương thức b trong cùng một lớp).

7. Bạn có phát hiện ra ngoại lệ nào không?

Những điều trên, tôi sẽ bổ sung thêm sau~

Phụ lục: Một số lưu ý về giao dịch @Transactional.

Có một số điểm cần lưu ý ở đây:

A. Việc một chức năng có cần giao dịch hay không phải được xem xét trong quá trình thiết kế và mã hóa. Chỉ hoàn thành những chức năng cơ bản thôi là chưa đủ.

B. Nếu một giao dịch được thêm vào, môi trường phát triển phải được thử nghiệm (môi trường thử nghiệm cũng phải cố gắng kích hoạt các ngoại lệ và khôi phục thử nghiệm) để đảm bảo rằng giao dịch có hiệu quả.

C. Vui lòng chú ý những điểm sau khi thực hiện giao dịch.

1. Không khai báo @Transactional trên giao diện mà hãy sử dụng chú thích @Transactional trên phương thức của lớp cụ thể, nếu không chú thích có thể không hợp lệ.

2. Đừng cố tiết kiệm rắc rối bằng cách đặt @Transactional trong khai báo cấp lớp. Đặt nó trong khai báo lớp sẽ khiến tất cả các phương thức có giao dịch. Do đó, @Transactional phải được đặt ở cấp phương thức. Không đặt giao dịch trong các phương thức không yêu cầu giao dịch, chẳng hạn như phương thức truy vấn. Nếu không sẽ ảnh hưởng đến hiệu suất.

3. Khi sử dụng phương thức @Transactional, @Transactional không hợp lệ đối với các lệnh gọi phương thức trong cùng một lớp. Ví dụ, có một lớp Test và nó có phương thức A. Sau đó, A gọi phương thức B của lớp Test (bất kể B là công khai hay riêng tư), nhưng A không khai báo giao dịch chú thích, trong khi B thì có. Sau khi A được gọi bên ngoài, giao dịch của B sẽ không có hiệu lực. (Đây là nơi thường xảy ra lỗi).

4. Các phương thức sử dụng @Transactional chỉ có thể là public. Các phương thức được chú thích bằng @Transactional chỉ hợp lệ khi được các lớp bên ngoài khác gọi, do đó chúng chỉ có thể là public. Lý do có liên quan đến điều trên. Do đó, nếu bạn sử dụng chú thích @Transactional trên phương thức được bảo vệ, riêng tư hoặc có thể nhìn thấy bằng gói, nó sẽ không báo lỗi, nhưng giao dịch sẽ không hợp lệ.

5. Sau khi thử nghiệm trong ICORE-CLAIM, kết quả như sau:

A. Ném ngoại lệ đã kiểm tra XXXException, giao dịch sẽ bị hủy bỏ.

B. Ném ra ngoại lệ thời gian chạy NullPointerException và giao dịch sẽ được hoàn lại.

C. Trong Quartz, nếu execute được gọi trực tiếp bằng phương thức @Transactional, nó có thể được khôi phục; nếu nó được gọi gián tiếp, nó sẽ không được khôi phục. (Tức là 3 điểm đã nêu ở trên).

D. Trong các tác vụ không đồng bộ, nếu execute được gọi trực tiếp bằng phương thức @Transactional, nó có thể được khôi phục; nếu nó được gọi gián tiếp, nó sẽ không được khôi phục. (Tức là 3 điểm đã nêu ở trên).

E. Thêm @Transactional vào hành động và nó sẽ không quay lại. Nhớ không thêm giao dịch vào hành động.

F. Thêm @Transactional vào dịch vụ. Nếu hành động gọi phương thức trực tiếp, nó sẽ quay lại. Nếu nó gọi phương thức gián tiếp, nó sẽ không quay lại. (Đó chính là những gì đã đề cập ở mục 3 ở trên).

G. Thêm @Transactional vào chú thích riêng tư trong dịch vụ và giao dịch sẽ không bị hủy bỏ.

Trên đây là kinh nghiệm cá nhân của tôi, hy vọng có thể cung cấp cho bạn một tài liệu tham khảo. Tôi cũng hy vọng bạn sẽ ủng hộ tôi. Nếu có bất kỳ sai sót hoặc cân nhắc nào chưa đầy đủ, xin vui lòng cho tôi biết.

Liên kết gốc: https://blog.csdn.net/u011410529/article/details/54287307.

Cuối cùng, bài viết này về cách giải quyết vấn đề giao dịch có chú thích @Transactional không quay lại và không hoạt động đã kết thúc tại đây. Nếu bạn muốn biết thêm về cách giải quyết vấn đề giao dịch có chú thích @Transactional không quay lại và không hoạt động, vui lòng tìm kiếm các bài viết CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .

28 4 0
qq735679552
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com