2009-10-07 36 views
7

Tôi không chắc chắn về chế độ cam kết tự động của java JDBC, tôi đang tạo kết nối có chế độ cam kết tự động được đặt thành false. Sau đó tôi kích hoạt một truy vấn chọn trên cơ sở dữ liệu, nó hoạt động tốt, tôi đang bị ấn tượng rằng cam kết phải được gọi chỉ để chèn, cập nhật, xóa các câu lệnh.Chế độ giả tự động giả mạo java

Bây giờ tôi có cần phải cam kết kết nối cho Chọn truy vấn không? Nếu không thì bảng đó sẽ bị khóa cho các giao dịch khác?

Xin cảm ơn, Rohit.

Trả lời

1

Tùy thuộc vào cấp độ cách ly của bạn. Nếu bạn sử dụng READ COMMITTED, SELECT chỉ tạo khóa nếu bạn chỉ định SELECT FOR UPDATE. Nếu bạn sử dụng REPEATABLE READ hoặc cao hơn, mỗi SELECT đều có thể tạo khóa (tùy thuộc vào kiểu cơ sở dữ liệu của bạn).

+0

http://java.sun.com/j2se/1.3/docs/api/java/sql/Connection.html#TRANSACTION_REPEATABLE_READ - không có gì về chọn statment tạo khóa. Khóa được tạo bởi các số liệu DML – cetnar

+0

Nếu bạn thực hiện "SELECT FOR UPDATE" trên Oracle DB, khối giao dịch thứ hai (chờ trên khóa) nếu nó thực hiện "SELECT FOR UPDATE" trên cùng một bản ghi. – tangens

+0

@tangens Tôi muốn chọn thường xuyên. Tôi đã chỉ vào phản ứng của tôi rằng chọn để cập nhật tạo khóa trong mọi trường hợp. Trong mô hình cách ly 'REPEATABLE READ', lựa chọn thường xuyên không tạo ra khóa. Chế độ cách ly tuân thủ các thay đổi và quy tắc không được tuân thủ để chọn dữ liệu bị ảnh hưởng bởi những thay đổi này. – cetnar

-2

Tôi không chắc chắn về chế độ cam kết tự động của java JDBC, tôi đang tạo kết nối có chế độ tự động cam kết được đặt thành false. Sau đó tôi kích hoạt một truy vấn chọn trên cơ sở dữ liệu, nó hoạt động tốt, tôi đang bị ấn tượng rằng cam kết phải được gọi chỉ để chèn, cập nhật, xóa các câu lệnh.

Điều đó phụ thuộc vào đơn đăng ký của bạn. Nếu có các bản cập nhật, chèn, xóa đơn giản, bạn có thể để lại autocommit = on. Generaly, nó được khuyến khích để tắt autocommit. Cấu hình đó mang lại cho bạn sự linh hoạt và mạnh mẽ hơn trong ứng dụng. Bạn có thể sử dụng các giao dịch phức tạp và bạn có thể quyết định thời điểm giao dịch bắt đầu và khi kết thúc.

Bây giờ tôi có cần phải cam kết kết nối cho Chọn truy vấn không? Nếu không thì bảng đó sẽ bị khóa cho các giao dịch khác?

Không, chọn statment không bắt đầu giao dịch (chèn, cập nhật, xóa) để không cần phải cam kết/khôi phục sau khi chọn statment. Có một trường hợp đặc biệt được chọn để khóa các hàng đã chọn và cần giao dịch - with for update clause

+0

Điều này không đúng. Tất cả các câu lệnh JDBC là ** luôn luôn ** được thực hiện trong ngữ cảnh giao dịch, bao gồm cả SELECT. – ChssPly76

+0

Bạn có chắc chắn không? Nếu truy vấn chọn sẽ bắt đầu giao dịch, nó sẽ chặn dữ liệu cho các lựa chọn khác. Chọn có thể được chạy trong các giao dịch hiện tại nhưng không bắt đầu giao dịch mới. – cetnar

+0

@cetnar - Tôi rất tích cực. Bất kỳ câu lệnh nào được thực thi đối với cơ sở dữ liệu (bao gồm cả các SELECT) được thực hiện trong ngữ cảnh giao dịch. Bất kỳ tuyên bố nào (ngoại trừ DDL trong một số trường hợp) có thể chạy trong giao dịch hiện tại hoặc giao dịch mới (tách biệt) sau giao dịch trước đó (nếu có) đã được cam kết/quay trở lại. Xem hướng dẫn JDBC (http://java.sun.com/docs/books/tutorial/jdbc/basics/transactions.html) hoặc spec để biết thêm chi tiết. – ChssPly76

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