cuốn sách gpt4 ai đã làm

java - ApplicationException - Java - Hibernate - Liên quan đến Rollback

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 08:29:17 29 4
mua khóa gpt4 Nike

Câu hỏi của tôi liên quan đến giao dịch và ngoại lệ

要求:

Tôi có 10 bản ghi muốn chèn vào bảng cơ sở dữ liệu. Sau khi chèn mỗi bản ghi, tôi chèn dữ liệu vào một bảng khác. Vì vậy, nếu chèn vào bảng thứ hai không thành công, tôi muốn khôi phục bản ghi đó.

ví dụ. Giả sử rằng việc chuyển tiền mặt (từ tài khoản này sang tài khoản khác) được xử lý cho 10 người cùng một lúc.

Mã giả:-------------- Bắt đầu phương thức EJB

for(int i = 0; i < TransferRecords.length; i++)
{
thử
{
// Khấu trừ tiền mặt từ TransferRecord.accountFrom --- Bao gồm việc sử dụng Phiên ngủ đông
// Thêm tiền mặt vào TransferRecord.accountTo -- Bao gồm việc sử dụng Phiên ngủ đông
} bắt (ngoại lệ AppException)
{
// Khôi phục giao dịch chỉ cho lần chuyển cụ thể này (i)
// Nhưng ở đây khi tôi tìm bản ghi tiếp theo thì nó báo phiên đã đóng
}
}

----------Phương thức EJB kết thúc

Ở đây AppException được tạo bằng chú thích @ApplicaitonException(rollback=true).

Chức năng chúng tôi muốn là: Ngay cả khi giao dịch cho TransferRecord (giả sử 2) không thành công, tôi muốn dữ liệu được cam kết cho bản ghi 0, bản ghi 1, bản ghi 3, bản ghi 4 (v.v... nhưng không phải cho bản ghi 2)

Nhưng vấn đề ở đây là: khi TransferRecord 2 bị lỗi và khi tôi chuyển sang TransferRecord 3 thì gặp lỗi "session Closed".

Những nghi ngờ của tôi là: 1. Đây có phải là cách tiếp cận đúng đắn không? Hoặc tôi nên chạy vòng lặp for bên ngoài EJB (đối với mỗi TransferRecord) 2. Làm thế nào để đảm bảo rằng phiên không bị đóng nhưng giao dịch được khôi phục (chỉ đối với một giao dịch thất bại cụ thể)

提前谢谢你。

Tôi đang sử dụng EJB3, Hibernate 3.x, Jboss 4.2.x và tôi đang sử dụng các giao dịch được quản lý vùng chứa.

câu trả lời hay nhất

Đây có phải là một cách tiếp cận đúng đắn?

Không, với CMT, phương pháp của bạn chính là đơn vị giao dịch của bạn. Vì vậy, ở đây, tất cả của bạn Chuyển hồ sơ Tất cả được xử lý trong cùng một giao dịch.

Nhân tiện, làm thế nào để khôi phục một giao dịch? bạn đang lan truyền Ngoại lệ thời gian chạy Hoặc gọi setRollbackOnly()? Tôi chỉ tò mò thôi.

Hay tôi nên chạy vòng lặp for (cho mỗi TransferRecord) bên ngoài EJB?

Tại sao lại ở bên ngoài? Không có gì buộc bạn phải làm điều đó. Nếu bạn muốn xử lý từng giao dịch trong giao dịch riêng của mình Chuyển hồ sơ, bạn nên chuyển chúng chokhác Các phương thức EJB (mã bên dưới bị ảnh hưởng bởi câu trả lời này cảm hứng):

// giả sử processRecords được xác định trên MyStatelessRemote1 và tiến trình được xác định trên MyStatelessLocal1
@Stateless
@TransationAttribution(TransactionAttributionType.NOT_SUPPORTED)
lớp công khai MyStatelessBean1 triển khai MyStatelessLocal1, MyStatelessRemote1 {
@EJB
riêng tư MyStatelessLocal1 myBean;

public void processRecords(List objs) {
// Không có nội dung giao dịch nên không cần giao dịch ở đây
for(Đối tượng obj : objs) {
this.myBean.process(obj);
}
}

@TransationAttribution(TransactionAttributionType.REQUIRES_NEW)
quy trình void công khai (TransferRecord transferRecord) {
// Nội dung giao dịch được thực hiện trong giao dịch của chính nó
// ...
}
}

Làm cách nào tôi có thể đảm bảo rằng phiên đó không bị đóng nhưng giao dịch được khôi phục (chỉ dành cho giao dịch không thành công cụ thể)

Tôi nghĩ rằng tôi đã bao gồm phần đó.

Về java - ApplicationException - Java - Hibernate - Rollback liên quan, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/2029438/

29 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress