Câu trả lời:
Miễn là bạn không CAM KẾT hoặc QUAY LẠI một giao dịch, giao dịch đó vẫn đang "chạy" và có khả năng bị khóa.
Nếu khách hàng của bạn (ứng dụng hoặc người dùng) đóng kết nối với cơ sở dữ liệu trước khi cam kết, mọi giao dịch vẫn đang chạy sẽ được khôi phục và chấm dứt.
Bạn thực sự có thể tự mình thử điều này, điều đó sẽ giúp bạn cảm nhận được cách hoạt động của nó.
Mở hai cửa sổ (tab) trong quản lý studio, mỗi cửa sổ sẽ có kết nối riêng với sql.
Bây giờ bạn có thể bắt đầu giao dịch trong một cửa sổ, thực hiện một số thao tác như chèn / cập nhật / xóa, nhưng chưa cam kết. thì trong cửa sổ khác, bạn có thể thấy cơ sở dữ liệu trông như thế nào từ bên ngoài giao dịch. Tùy thuộc vào mức độ cô lập, bảng có thể bị khóa cho đến khi cửa sổ đầu tiên được cam kết hoặc bạn có thể (không) xem giao dịch khác đã thực hiện những gì cho đến nay, v.v.
Chơi xung quanh các mức độ cách ly khác nhau và không có gợi ý khóa để xem chúng ảnh hưởng như thế nào đến kết quả.
Cũng xem điều gì sẽ xảy ra khi bạn gặp lỗi trong giao dịch.
Điều rất quan trọng là phải hiểu tất cả những thứ này hoạt động như thế nào nếu không bạn sẽ bị bối rối bởi những gì sql làm, nhiều lần.
Chúc vui vẻ! GJ.
Các giao dịch nhằm mục đích chạy hoàn toàn hoặc không. Cách duy nhất để hoàn thành giao dịch là cam kết, bất kỳ cách nào khác sẽ dẫn đến việc hoàn trả.
Do đó, nếu bạn bắt đầu và sau đó không cam kết, nó sẽ được khôi phục khi đóng kết nối (vì giao dịch bị ngắt mà không được đánh dấu là hoàn thành).
phụ thuộc vào mức độ cô lập của giao dịch nhập cảnh.
Khi bạn mở một giao dịch, không có gì bị khóa bởi chính nó. Nhưng nếu bạn thực hiện một số truy vấn bên trong giao dịch đó, tùy thuộc vào mức độ cô lập, một số hàng, bảng hoặc trang bị khóa, do đó nó sẽ ảnh hưởng đến các truy vấn khác cố gắng truy cập chúng từ các giao dịch khác.
Ví dụ cho Giao dịch
bắt đầu tran tt
Câu lệnh sql của bạn
nếu lỗi xảy ra rollback tran tt khác cam kết tran tt
Miễn là bạn chưa thực hiện commit tran tt, dữ liệu sẽ không bị thay đổi
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
không hoạt động, chẳng hạn. Xem stackoverflow.com/questions/1273376/…
Ngoài các vấn đề khóa tiềm ẩn mà bạn có thể gây ra, bạn cũng sẽ thấy rằng nhật ký giao dịch của mình bắt đầu phát triển vì chúng không thể bị cắt bớt quá LSN tối thiểu cho một giao dịch đang hoạt động và nếu bạn đang sử dụng cách ly ảnh chụp nhanh thì cửa hàng phiên bản của bạn trong tempdb sẽ phát triển cho lý do tương tự.
Bạn có thể sử dụng dbcc opentran
để xem chi tiết của giao dịch mở cũ nhất.
Bất kỳ giao dịch nào không được ghi chú sẽ khiến máy chủ bị khóa và các truy vấn khác sẽ không thực hiện trên máy chủ. Bạn cần khôi phục giao dịch hoặc cam kết giao dịch đó. Việc đóng SSMS cũng sẽ chấm dứt giao dịch, điều này sẽ cho phép các truy vấn khác thực hiện.
Hành vi không được xác định, vì vậy bạn phải đặt rõ ràng một cam kết hoặc một lần khôi phục:
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
"Nếu chế độ cam kết tự động bị tắt và bạn đóng kết nối mà không cam kết rõ ràng hoặc khôi phục các thay đổi cuối cùng của mình, thì hoạt động COMMIT ngầm sẽ được thực thi."
Hsqldb thực hiện khôi phục
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
kết quả là
2011-11-14 14: 20: 22,519 THÔNG TIN chính [SqlAutoCommitExample: 55] [AutoCommit enable = false] 2011-11-14 14: 20: 22,546 THÔNG TIN chính [SqlAutoCommitExample: 65] [Đã tìm thấy 0 # người dùng trong cơ sở dữ liệu]