Tự động cam kết trong SQL Server và Oracle


7

Khi tôi làm việc trên Oracle 8 nhiều năm trước, tôi đã từng thực hiện lệnh CommIT theo cách thủ công sau mỗi lần INSERT số lượng lớn. Trong SQL Server, Auto-Commit được BẬT theo mặc định có lợi thế cũng như các mối nguy hiểm.

Tôi muốn biết liệu các phiên bản mới hơn của Oracle vẫn có Auto-Commit OFF theo mặc định không? Tôi cũng muốn biết cách đặt TẮT Tự động Cam kết trong SQL Server 2005.

Câu trả lời:


7

Oracle

Từ AskTom năm 2000:

... Phương pháp duy nhất mà Oracle vận hành là "khách hàng cho chúng tôi biết khi nào cần cam kết". Chúng tôi không có chế độ tự động. Nhiều CÔNG CỤ và API khác nhau (ví dụ: Tôi có thể nói với sqlplus cho autocommit, điều đó chỉ có nghĩa là sqlplus sẽ đưa ra một cam kết sau mỗi câu lệnh).

Điều này vẫn đúng và có lẽ sẽ luôn luôn như vậy. Để biết mô tả chi tiết, commithãy xem tài liệu của Oracle

Máy chủ SQL 2000+

từ SO (đảo ngược):

Bạn có thể TẮT autocommit bằng cách đặt ẩn.

hoặc nếu bạn thích, từ các tài liệu (hoặc liên kết trực tiếp hơn của Mark )


1
Với việc xóa các hàng ngẫu nhiên gần đây trong SQL Server, tôi cảm thấy, TỰ ĐỘNG-CAMIT nên được TẮT theo mặc định. Nó là nguy hiểm để chơi khi nó được BẬT theo mặc định.
RPK

1
Tôi nói hãy đi với mặc định và cẩn thận hơn, xin lỗi :)
Jack nói hãy thử topanswers.xyz

Chúng tôi không cẩn thận theo mặc định và do đó có một tùy chọn để Khôi phục.
RPK

Tôi không hiểu ý của bạn là gì mà tôi sợ? Tôi rất vui được trò chuyện nếu bạn thích?
Jack nói hãy thử topanswers.xyz


5

Đối với SQL Server, bạn sẽ THIẾT LẬP IMPLICIT_TRANSACTIONS .

Trong chế độ giao dịch ngầm, mọi DML ( SELECT, INSERT, DELETE, UPDATEvv) hoặc DDL ( CREATE, ALTER, DROPvv) sẽ bắt đầu giao dịch và bạn phải rõ ràng COMMIThoặc ROLLBACK.

Ngoài ra, một giao dịch rõ ràng có thể được bắt đầu với BEGIN TRANSACTION.


4

Như đã được trả lời ở trên, trong SQL, bạn có thể đặt các giao dịch ngầm cho kết nối của mình với SET IMPLICIT_TRANSACTIONS ONcài đặt đó và sử dụng các liên kết mà Mark và Jack cung cấp.

Tôi sẽ thận trọng chống lại việc làm điều này trên bảng và thậm chí thực hiện nó thường xuyên trong các kết nối của riêng bạn. Mặt trái của việc thực hiện thay đổi này là bây giờ bạn có một giao dịch cho tất cả các hành động của mình. Nếu bạn không tự mình quản lý hoặc dọn dẹp, giờ đây bạn có thể có các giao dịch mở xung quanh việc chặn DML trong hệ thống của bạn.

Nếu bạn lo ngại về việc vô tình xóa / cập nhật các hàng sai khi thực hiện dọn dẹp thủ công, có một số tùy chọn tốt hơn:

  1. Sao lưu trước
  2. Trước tiên hãy sao lưu bảng bằng cách chọn tất cả các hàng vào một bảng mới (Chọn * vào tmpInCaseIMessUp_TableName_mw TỪ Tên bảng)
  3. Tập thói quen gõ BEGIN TRANSACTIONtrước khi viết cập nhật / chèn / xóa từ hệ thống ...

Đôi khi tôi sẽ bắt đầu một phiên và gõ

BEGIN TRAN

-- COMMIT TRAN 

(đã bình luận để nó không xảy ra nhưng gõ nó để tôi không bận và quên)

Sau đó, tôi sẽ thực hiện công việc của mình sau khi bắt đầu tran, viết một câu lệnh chọn trong cùng một phiên hiển thị hình ảnh sau để đảm bảo rằng tôi đã không gây rối (hoặc chỉ dựa vào số lượng hàng bị ảnh hưởng, v.v.) và sau đó cam kết nếu tất cả có vẻ tốt.


"Nếu bạn không tự mình quản lý hoặc dọn dẹp, giờ đây bạn có thể có các giao dịch mở xung quanh việc chặn DML trong hệ thống của mình." không đúng sự thật Khi kết nối implicit_transilities bị chấm dứt, mọi giao dịch mở sẽ tự động được khôi phục.
Mark Storey-Smith

"Khi kết nối ngầm định_transilities bị chấm dứt, mọi giao dịch mở sẽ tự động được khôi phục." Đó là dọn dẹp ;-) Mở một cửa sổ thứ hai trong SSMS, bận rộn ở đó, trả lời một số e-mail và gọi điện thoại ... Đó không phải là dọn dẹp.
Mike Walsh

Tôi đang nghĩ mã ứng dụng, bạn đang nghĩ SSMS. Tôi rất có thói quen BEGIN TRAN trên mọi cửa sổ SSMS như bạn đề xuất, vì những lý do chính xác mà bạn đề cập.
Mark Storey-Smith

Tôi nghĩ rằng cài đặt có thể còn tồi tệ hơn trong các kết nối ứng dụng. Bạn đã thấy mã và quản lý giao dịch trong hầu hết các ứng dụng? Có thể tôi chỉ được gọi khi mọi thứ tồi tệ và tôi không thấy điều tốt nhưng tôi thấy rất nhiều người không quản lý giao dịch đủ rõ ràng. Tôi đang nghĩ đến. Tôi đã nghĩ rằng OP đã đề cập đến SSMS đã thực hiện các thay đổi.
Mike Walsh

1
Về # 3, Gói công cụ SSMStính năng Mẫu truy vấn mới , theo mặc định, được đặt thành BEGIN TRAN ... ROLLBACK.
Nick Chammas

4

Chà ... hoàn toàn không đúng khi Oracle không có chế độ tự động. Nếu bạn nhìn vào OCI cơ bản, bạn có thể thấy rằng có một OCI_COMMIT_ON_SUCCESSlá cờ bạn có thể chuyển đến OCIStmtExecute(). Tại sao bạn sẽ làm điều này? Chà, nếu bạn đang sử dụng mô hình rất phổ biến của INSERT → CAM KẾT → INSERT → ... (ví dụ: khi ghi dữ liệu chuỗi thời gian) thì điều này giảm một nửa số chuyến đi khứ hồi mạng bạn cần thực hiện, đó có thể là một cải tiến hiệu suất rất đáng kể để sử dụng cờ này, đặc biệt là qua các liên kết WAN.

Nếu bạn vượt qua OCI_DEFAULTdưới dạng cờ, thì có, autocommit đã tắt, vì vậy đây là hành vi mặc định.


3

Trong máy chủ SQL (được thử nghiệm với SQL2005), để đặt tự động cam kết ở cấp máy chủ, bạn có thể sử dụng TSQL như được giải thích bởi những người khác ở trên hoặc bạn có thể sử dụng GUI SSMS. Để sử dụng SSMS:

  1. Mở SSMS và kết nối với máy chủ SQL của bạn.
  2. Trên thanh menu bấm vào Công cụ> tùy chọn.
  3. Trong cửa sổ tùy chọn, mở rộng 'Thực thi truy vấn'> 'Máy chủ SQL'.
  4. Nhấp vào 'ANSI'.
  5. Chọn \ Bỏ chọn hộp kiểm 'SET IMPLICIT_TRANSACTIONS'.

Nếu hộp được bỏ chọn, điều đó có nghĩa là tự động xác nhận được bật. Nếu hộp được chọn, điều đó có nghĩa là tự động xác nhận đã tắt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.