Như Nick và Martin đã đề cập, trạng thái cuối cùng của truy vấn của bạn phụ thuộc vào việc SQL Server có biết về việc kéo cáp mạng của bạn hay không trước khi truy vấn hoàn thành. Từ Sách trực tuyến (mặc dù tôi thấy thú vị rằng có các chủ đề tương đương cho điều này vào năm 2000 , 2005 , 2008 và 2008 R2 , nhưng không phải là 2012 hay 2014):
Nếu một lỗi ngăn cản việc hoàn thành giao dịch thành công, SQL Server sẽ tự động khôi phục giao dịch và giải phóng tất cả các tài nguyên do giao dịch nắm giữ. Nếu kết nối mạng của máy khách với một phiên bản của Công cụ cơ sở dữ liệu bị hỏng, mọi giao dịch chưa xử lý cho kết nối sẽ được khôi phục khi mạng thông báo về trường hợp bị hỏng. Nếu ứng dụng khách bị lỗi hoặc nếu máy khách bị hỏng hoặc khởi động lại, điều này cũng sẽ phá vỡ kết nối và trường hợp của Công cụ cơ sở dữ liệu sẽ khôi phục mọi kết nối chưa xử lý khi mạng thông báo về sự cố. Nếu khách hàng đăng xuất khỏi ứng dụng, mọi giao dịch chưa xử lý sẽ được khôi phục.
(Bên cạnh đó, các kết nối từ đó trong câu cuối cùng thứ 2 có lẽ là các giao dịch . Tôi không biết làm thế nào một kết nối lại kết nối.)
Theo cách tương tự, SQL Server có thể hoàn tác hoặc thực hiện lại các giao dịch trong quá trình khôi phục sau khi máy chủ bị tắt đột ngột và điều này sẽ phụ thuộc vào trạng thái của giao dịch tại thời điểm tắt máy. Tôi đã thấy mọi người sử dụng chiến thuật này để đạt được những gì bạn đang cố gắng (hủy (các) giao dịch) và khi máy chủ khởi động lại, phần lớn công việc chỉ đơn giản là làm lại (vì vậy hiệu ứng ròng của phản ứng giật đầu gối của họ gần hơn rất nhiều đến không hơn họ mong đợi).
Vì vậy, thay vì phải chịu điều này, thay vì làm những việc quyết liệt trong hoảng loạn, như giật cáp mạng hoặc tắt máy, tôi đề nghị trong tương lai bạn nên có kỷ luật tốt hơn về việc chạy các truy vấn ad hoc đối với các hệ thống quan trọng. Ví dụ: thay vì:
UPDATE dbo.sometable
-- where *oops* I forgot this part
Có cái này:
BEGIN TRANSACTION;
UPDATE dbo.sometable
-- where *oops* I forgot this part
-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;
Sau đó, nếu bản cập nhật thực sự chính xác, bạn có thể đánh dấu COMMIT
phần đó và chạy nó. Nếu không, bạn có thể bình tĩnh làm nổi bật ROLLBACK
phần đó và chạy phần đó. Bạn thậm chí có thể sử dụng các bổ trợ như Gói công cụ SSMS để chỉnh sửa New Query
mẫu của mình để bao gồm bản tóm tắt đó.
Bây giờ nó vẫn có thể khiến bạn gặp rắc rối trong trường hợp bạn chạy truy vấn và sau đó không cam kết hoặc quay lại, vì bây giờ giao dịch của bạn đang chặn người dùng khác. Nhưng điều này là tốt hơn sau đó sửa đổi dữ liệu không thể thay đổi.
Và tất nhiên, như mọi khi, có một bản sao lưu mà bạn có thể dựa vào.