2012-05-04 15 views
7

Tôi đã nhận thấy một số lập trình viên sử dụng COMMIT khác bằng conn.setAutoCommit (true); để kết thúc giao dịch hoặc quay lại, vậy lợi ích của việc sử dụng giao dịch này thay vì giao dịch nào? Sự khác biệt chính ở đâu?COMMIT HOẶC conn.setAutoCommit (đúng)

conn.setAutoCommit(true); 

qua

statement.executeQuery(query); 
statement.commit(); 
+1

Chúng là các công cụ riêng biệt cho các mục đích khác nhau. Một không phải là "tốt hơn" hoặc "chính xác hơn" so với cái kia. – Affe

+0

khi sử dụng ứng dụng khách cam kết trên mạng không thể xem các bản ghi mới ngay cả khi chúng làm mới kết quả, nhưng khi được đặt thành tự động đúng, nó hoạt động tốt, đó là vấn đề của tôi. – Motasem

+0

Câu hỏi này cho thấy sự hiểu lầm về hai phương pháp. Như Affe nói, họ không có cách nào giống như vậy. Khi chế độ tự động cam kết được bật, thì mọi câu lệnh đều tự động được cam kết. Khi nó được kích hoạt, các giao dịch được bắt đầu ngầm, và commit() phải được gọi để thực sự cam kết chúng (ngay cả khi một giao dịch không được bắt đầu rõ ràng). commit() cam kết một giao dịch mở. setAutoCommit xác định xem giao dịch có bắt đầu ngầm hay rõ ràng (loại). – Corbin

Trả lời

9

Bạn nên sử dụng chung Connection.commit() và không phải Connection.setAutoCommit(true) để thực hiện giao dịch, trừ khi bạn muốn chuyển từ sử dụng giao dịch sang mô hình 'giao dịch cho mỗi câu lệnh' của autoCommit.

Điều đó nói rằng, gọi Connection.setAutoCommit(true) trong khi trong giao dịch sẽ thực hiện giao dịch (nếu người lái xe khiếu nại với mục 10.1.1 của thông số kỹ thuật JDBC 4.1). Nhưng bạn thực sự chỉ nên làm điều đó nếu bạn có ý định ở lại autoCommit sau đó, khi bật/tắt autoCommit trên kết nối có thể có phí cao hơn trên kết nối hơn là cam kết đơn giản (ví dụ vì nó cần chuyển đổi giữa các người quản lý giao dịch, thực hiện kiểm tra bổ sung , v.v.)

Bạn cũng nên sử dụng Connection.commit() và không sử dụng lệnh SQL gốc COMMIT. Chi tiết trong tài liệu về kết nối:

Lưu ý: Khi định cấu hình kết nối, ứng dụng JDBC nên sử dụng phương thức kết nối như setAutoCommit hoặc setTransactionIsolation. Các ứng dụng không nên gọi trực tiếp các lệnh SQL để thay đổi cấu hình của kết nối khi có sẵn phương thức JDBC.

Cái này là lệnh như commit()SetAutoCommit(boolean) có thể làm nhiều việc hơn trong lòng đất trở lại, như đóng ResultSets và đóng cửa hoặc đặt Statements. Sử dụng lệnh SQL COMMIT sẽ bỏ qua điều này và có khả năng đưa trình điều khiển/kết nối của bạn vào trạng thái không chính xác.

+0

Đây không phải là những gì người dùng đã hỏi. – Corbin

+0

@Corbin Tôi đã cập nhật câu trả lời của mình. Tôi tập trung quá nhiều vào 'COMMIT' trong văn bản. –

4

Việc sử dụng conn.setAutoCommit(); áp dụng cho các kết nối và cung cấp cho bạn khả năng để thực hiện các truy vấn X trong một giao dịch duy nhất, hoặc sử dụng một giao dịch duy nhất cho mỗi execute

Như API mô tả:

void setAutoCommit(boolean autoCommit) 
        throws SQLException 

Đặt chế độ tự động cam kết của kết nối này thành trạng thái đã cho. Nếu kết nối ở chế độ tự động cam kết thì tất cả các câu lệnh SQL của nó sẽ được thực hiện và cam kết là các giao dịch riêng lẻ. Nếu không, các câu lệnh SQL của nó được nhóm vào các giao dịch được kết thúc bằng một cuộc gọi đến phương thức cam kết hoặc phương thức rollback. Theo mặc định, các kết nối mới trong chế độ

cam kết tự động Đối với một trường hợp đơn giản:

conn.setAutoCommit(false); 
statement.executeQuery(query); 
statement.commit(); 

sẽ được giống như:

conn.setAutoCommit(true); 
statement.executeQuery(query); 
+0

bạn cũng nên hiển thị sự khác biệt khi sử dụng 2 câu lệnh chèn/cập nhật/xóa trong một phương thức –

+0

nếu conn.setAutoCommit (đúng); sau đó tôi sẽ không được lưu vì ACID là một ưu tiên ở đây, nhưng tôi có thể sử dụng conn.setAutoCommit (false); statement.executeQuery (truy vấn); statement.commit(); conn.setAutoCommit (true); và những gì sẽ là sự phản ánh trong caase này? – Motasem

+0

@Motasem nhưng 'conn.setAutoCommit (đúng); statement.executeQuery (truy vấn); 'sẽ làm tương tự như' conn.setAutoCommit (false); statement.executeQuery (truy vấn); statement.commit(); 'kiểm tra nếu' statement.commit() 'của bạn đang được gọi với thành công và không trả về một số' SQLException' – MrJames

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