Điều đó tùy thuộc vào nơi bạn có kết nối đó. Nếu bạn tự tạo kết nối, không cần khôi phục trạng thái tự động cam kết.
Nếu bạn nhận từ nguồn dữ liệu, bạn nên khôi phục trạng thái thành số vì nguồn dữ liệu có thể giữ kết nối trong một nhóm và mã tiếp theo có thể không mong đợi những gì bạn đã đặt.
commit()
không ảnh hưởng đến giá trị của cam kết tự động. Việc kích hoạt cam kết tự động chỉ đảm bảo rằng trình điều khiển JDBC gọi commit()
sau mỗi câu lệnh mà bạn thực hiện. Bạn vẫn có thể gọi số commit()
bao nhiêu lần tùy ý, nó sẽ không có hiệu lực (ngoại trừ rollback()
sẽ không phải lúc nào cũng làm những gì bạn muốn).
[EDIT] Cách cam kết tự động được xử lý tùy thuộc vào hồ bơi kết nối của bạn. dbcp có tùy chọn cấu hình để tự động tắt trước khi cung cấp cho bạn kết nối, c3p0 sẽ quay lại kết nối khi bạn quay lại hồ bơi. Đọc tài liệu cho hồ bơi kết nối của bạn cách hoạt động.
Nếu bạn không biết sử dụng hồ bơi nào, giải pháp an toàn là đặt cam kết tự động thành false
bất cứ khi nào bạn có kết nối và quay lại kết nối nếu bạn nhận được ngoại lệ. Tôi đề xuất viết một trình bao bọc:
public <T> T withTransaction(TxCallback<T> closure) throws Exception {
Connection conn = getConnection();
try {
boolean autoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
T result = closure.call(conn); // Business code
conn.commit();
conn.setAutoCommit(autoCommit);
} catch(Exception e) {
conn.rollback();
} finally {
conn.close();
}
}
Mã này sẽ xử lý chính xác kết nối cho bạn và bạn không cần phải lo lắng về nó nữa trong mã doanh nghiệp của mình.
Nguồn
2012-09-13 08:34:27
Bản thân nhóm kết nối có trách nhiệm khôi phục trạng thái kết nối trả về autoCommit(). Đó không phải là trách nhiệm của người truy xuất kết nối. –
@MarkRotteveel: Tham khảo? –
@AaronDigulla Bạn có thể vui lòng giải thích về "rollback() sẽ không luôn luôn làm những gì bạn muốn"? –