2013-09-26 141 views
15

Tôi đã thực hiện một số cập nhật cho bản ghi của mình thông qua Trình quản lý máy chủ SQL.Chúng ta có cần thực thi lệnh Cam kết sau khi Cập nhật trong SQL Server

Vì câu lệnh Cập nhật không có cam kết rõ ràng, tôi đang cố gắng viết thủ công.

Update mytable 
set status=0; 
Commit; 

Tôi nhận được thông điệp như Cam đã không bắt đầu giao dịch

+0

Bạn nên bắt đầu một giao dịch trước khi cam kết. –

+2

Bạn nên mở một giao dịch. Bên trong nó, bạn nên thực hiện cập nhật rồi cam kết thay đổi. – lexeme

+0

Xem cách hoạt động tại đây: http://www.codeproject.com/Articles/10223/Using-Transactions-in-ADO-NET – lexeme

Trả lời

30

SQL Server Management Studio đã bật tính năng cam kết ngầm định, vì vậy tất cả các câu lệnh được thực hiện đều được cam kết hoàn toàn.

Điều này có thể là một điều đáng sợ nếu bạn đến từ một nền tảng Oracle, nơi mặc định là không có lệnh tự động được cam kết, nhưng nó không phải là một vấn đề lớn.

Nếu bạn vẫn muốn sử dụng giao dịch ad-hoc, bạn luôn có thể thực hiện

BEGIN TRANSACTION 

trong SSMS, và hơn hệ thống chờ đợi cho bạn để thực hiện các dữ liệu.

Nếu bạn muốn sao chép hành vi của Oracle, và bắt đầu một giao dịch tiềm ẩn, bất cứ khi nào một số DML/DDL được phát hành, bạn có thể thiết lập SET IMPLICIT_TRANSACTIONS hộp kiểm trong

Tools -> Options -> Query Execution -> SQL Server -> ANSI 
+2

Xin chào @SWeko. rất hữu ích, thx. Tôi có quyền giả định, hộp kiểm đó không được kiểm soát có nghĩa là các giao dịch được cam kết hoàn toàn không? Đó là tình huống (mặc định) của tôi. Đặt tên của hộp kiểm đó là lạ, sau đó. btw, vấn đề liên quan ở đây: http://stackoverflow.com/questions/17576649/safely-delete-rows-in-sqlserver-so-you-can-rollback-a-commit –

+0

Cảm ơn bạn đã trả lời – Patan

+0

Nếu hộp kiểm là kiểm tra, sau đó một câu lệnh 'SELECT', bắt đầu ngầm một giao dịch, điều đó sẽ cần phải được cam kết rõ ràng. – SWeko

5

Sql server không giống như oracle không cần cam kết, trừ khi bạn đang sử dụng các giao dịch.
Ngay sau khi câu lệnh cập nhật của bạn, bảng sẽ được cam kết, không sử dụng lệnh cam kết trong trường hợp này.