2012-09-13 17 views
5

Có kết nối db (conn) từ hồ bơi.được thiết lập tự động (đúng) sau conn.commit()

Giả sử rằng autocommit là TRUE trên kết nối đó.

Bây giờ conn.setautocommit(false) đã được đặt;

sau đó sau một vài cập nhật câu lệnh và cuối cùng là conn.commit()/conn.rollback() đã hoàn tất.

Bây giờ tôi có cần phải làm rõ ràng mã số setautocommit(true) để hoàn nguyên về trạng thái kết nối trước đó không?

HOẶC commit()\rollback() sẽ đặt setautocommit(true) vốn có?

Trả lời

7

Đ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.

+0

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. –

+0

@MarkRotteveel: Tham khảo? –

+0

@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"? –

0

conn.setAutoCommit (autoCommit); nên di chuyển đến khối cuối cùng

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