Nếu bạn không quay lại giao dịch, thay đổi vẫn được thực hiện?


10

Nói rằng tôi đang chạy một truy vấn

begin tran

update users
set name = 'Jimmy'
where name = 'john'

Nếu tôi không quay lại giao dịch, những thay đổi này sẽ vẫn được thực hiện, liệu nó có gây ra lỗi hay không, dù sao nó cũng sẽ hoạt động như một rollback?


Tôi đoán điều đó phụ thuộc vào hành vi của phần mềm máy khách bạn sử dụng để chạy các câu lệnh này hoặc ứng dụng nơi chúng được nhúng. Một số có thể tự động cam kết nếu được định cấu hình (SSMS sẽ làm điều đó theo mặc định).
mustaccio

3
Các giao dịch được tuyên bố rõ ràng không tự động cam kết. Vì Josh đã tuyên bố bắt đầu một giao dịch, nó sẽ hành xử chính xác như Justin Cave đã trả lời.
Dave

Câu trả lời:


16

Bạn phải hiểu giao dịch là gì - Đó là một đơn vị công việc. Đó là TẤT CẢ hoặc KHÔNG CÓ (theo các thuộc tính ACID ) và điều này đảm bảo tính nhất quán của cơ sở dữ liệu.

Nếu tôi không quay lại giao dịch, những thay đổi này sẽ vẫn được thực hiện

Những thay đổi sẽ được thực hiện chỉ khi bạn cam kết. Máy chủ SQL sẽ ghi lại tất cả các thay đổi vào nhật ký giao dịch và một khi bạn cam kết, chúng sẽ được làm cứng vào tệp dữ liệu.

Nếu bạn không cam kết, thì giao dịch của bạn sẽ vẫn MỞ vô thời hạn - mà bạn có thể thấy sys.dm_tran_active_transactions / sys.dm_tran_database_transactions / sys.dm_tran_session_transactionshoặc sử dụng DBCC OPENTRAN.

Ngoài ra, những gì bạn đã bắt đầu là một giao dịch rõ ràng , cần được kết thúc rõ ràng bằng câu lệnh CAMIT hoặc ROLLBACK.

Cũng đọc - Có phải là một thực tế xấu khi luôn tạo ra một giao dịch?


@JoshStevenson Tôi nghĩ rằng nó đáng để đọc trong khi đọc về Hoạt động nguyên tử trong bối cảnh cơ sở dữ liệu.
Nelz

12

Nếu bạn không cam kết cũng không phục hồi giao dịch, giao dịch sẽ tiếp tục tồn tại vô thời hạn. Nó sẽ tiếp tục giữ các khóa của nó, có khả năng chặn các phiên khác, cho đến khi bạn kết thúc giao dịch thông qua commitmột rollbackhoặc cho đến khi DBA xuất hiện và giết chết phiên (hoặc cho đến khi một cái gì đó như trục trặc mạng khiến kết nối không thành công). Nếu một DBA giết chết phiên này, họ sẽ hoàn toàn đưa ra một bản rollback cho điều này và bất kỳ giao dịch mở nào khác.


Đây là câu trả lời thích hợp. Nếu không có thông tin này, sẽ không có ý nghĩa gì đối với tôi cho cả hai câu lệnh CAMIT và ROLLBACK được sử dụng hoàn toàn.
Tarec

1

Thay đổi sẽ không được thực hiện cho đến khi và trừ khi giao dịch được cam kết, tất cả hoặc không có gì như đã nêu ở trên,

Tính nguyên tử là lý do đằng sau điều này, Bạn có thể kiểm tra các thuộc tính giao dịch ACID, các thuộc tính cơ bản mà hệ thống cơ sở dữ liệu tuân theo.

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.