Tôi đã thử thí nghiệm sau và nhận được kết quả tương tự. Trong cả hai trường hợp, fn_dblog () hiển thị rollback xảy ra và dường như xảy ra nhanh hơn trong Kịch bản 2 so với Kịch bản 1.
Nhân tiện, tôi đã đặt cả MDF và LDF trên cùng một đĩa ngoài (USB 2.0).
Kết luận ban đầu của tôi là không có sự khác biệt trong hoạt động của rollback trong trường hợp này và có lẽ bất kỳ sự khác biệt tốc độ rõ ràng nào là liên quan đến hệ thống con I / O. Đó chỉ là giả thuyết làm việc của tôi vào lúc này.
Cảnh 1:
- Tạo cơ sở dữ liệu với tệp nhật ký bắt đầu ở mức 1MB, tăng theo 4 MB và có kích thước tối đa 100 MB.
- Mở một giao dịch rõ ràng, chạy nó trong 10 giây và sau đó hủy thủ công trong SSMS
- Nhìn vào số lượng fn_dblog () và kích thước dự trữ nhật ký và kiểm tra DBCC SQLPERF (LOGSPACE)
Kịch bản 2:
- Tạo cơ sở dữ liệu với tệp nhật ký bắt đầu ở mức 1MB, tăng theo 4 MB và có kích thước tối đa 100 MB.
- Mở một giao dịch rõ ràng, chạy nó cho đến khi nhật ký đầy lỗi xuất hiện
- Nhìn vào số lượng fn_dblog () và kích thước dự trữ nhật ký và kiểm tra DBCC SQLPERF (LOGSPACE)
Kết quả giám sát hiệu suất:
Cảnh 1:
Kịch bản 2:
Mã số:
SỬ DỤNG [chủ];
ĐI
NẾU DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
BẮT ĐẦU
THAY ĐỔI CƠ SỞ [SampleDB] SET SINGLE_USER
VỚI ROLLBACK NGAY LẬP TỨC;
DROP DATABASE [SampleDB];
KẾT THÚC;
ĐI
TẠO cơ sở dữ liệu [SampleDB] TRÊN CHÍNH
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, KÍCH THƯỚC = 3MB
, TÀI LIỆU = 1MB
)
ĐĂNG NHẬP
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, KÍCH THƯỚC = 1MB
, TỐI ĐA = 100MB
, TÀI KHOẢN = 4MB
);
ĐI
SỬ DỤNG [SampleDB];
ĐI
- Thêm một bảng
TẠO BẢNG dbo.test
(
c1 CHAR (8000) KHÔNG PHẢI TRẢ LẠI ('a', 8000)
) TRÊN [CHÍNH HÃNG];
ĐI
- Đảm bảo rằng chúng tôi không phải là mô hình phục hồi giả đơn giản
BACKUP DATABASE SampleDB
ĐẾN DISK = 'NUL';
ĐI
- Sao lưu tệp nhật ký
BACKUP LOG SampleDB
ĐẾN DISK = 'NUL';
ĐI
- Kiểm tra không gian nhật ký đã sử dụng
DBCC SQLPERF (LOGSPACE);
ĐI
- Có bao nhiêu bản ghi được hiển thị với fn_dblog ()?
CHỌN * TỪ fn_dblog (NULL, NULL); - Khoảng 9 trong trường hợp của tôi
/ ****** / 4/8/4/4/4
CẢNH 1
****** / TÌM KIẾM
- Mở một giao dịch mới và sau đó cuộn lại
BEGIN GIAO DỊCH
XÁC NHẬN VÀO GIÁ TRỊ DEFAULT Dbo.test;
GO 10000 - Hãy chạy trong 10 giây và sau đó nhấn hủy trong cửa sổ truy vấn SSMS
- Hủy giao dịch
- Sẽ mất vài giây để hoàn thành
- Không cần phải quay lại giao dịch, vì việc hủy đã làm điều đó cho bạn.
-- Hãy thử nó. Bạn sẽ gặp lỗi này
- Msg 3903, Cấp 16, Bang 1, Dòng 1
- Yêu cầu GIAO DỊCH ROLLBACK không có GIAO DỊCH BEGIN tương ứng.
GIAO DỊCH ROLLBACK;
- Không gian đăng nhập được sử dụng là gì? Trên 100%.
DBCC SQLPERF (LOGSPACE);
ĐI
- Có bao nhiêu bản ghi được hiển thị với fn_dblog ()?
LỰA CHỌN *
TỪ fn_dblog (NULL, NULL); - Khoảng 91.926 trong trường hợp của tôi
- Tổng dự trữ nhật ký được hiển thị bởi fn_dblog ()?
CHỌN SUM ([Dự trữ nhật ký]) NHƯ [Tổng dự trữ nhật ký]
TỪ fn_dblog (NULL, NULL); - Khoảng 88,72MB
/ ****** / 4/8/4/4/4
PHONG CÁCH 2
****** / TÌM KIẾM
- Thổi bay DB và bắt đầu lại
SỬ DỤNG [chủ];
ĐI
NẾU DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
BẮT ĐẦU
THAY ĐỔI CƠ SỞ [SampleDB] SET SINGLE_USER
VỚI ROLLBACK NGAY LẬP TỨC;
DROP DATABASE [SampleDB];
KẾT THÚC;
ĐI
TẠO cơ sở dữ liệu [SampleDB] TRÊN CHÍNH
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, KÍCH THƯỚC = 3MB
, TÀI LIỆU = 1MB
)
ĐĂNG NHẬP
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, KÍCH THƯỚC = 1MB
, TỐI ĐA = 100MB
, TÀI KHOẢN = 4MB
);
ĐI
SỬ DỤNG [SampleDB];
ĐI
- Thêm một bảng
TẠO BẢNG dbo.test
(
c1 CHAR (8000) KHÔNG PHẢI TRẢ LẠI ('a', 8000)
) TRÊN [CHÍNH HÃNG];
ĐI
- Đảm bảo rằng chúng tôi không phải là mô hình phục hồi giả đơn giản
BACKUP DATABASE SampleDB
ĐẾN DISK = 'NUL';
ĐI
- Sao lưu tệp nhật ký
BACKUP LOG SampleDB
ĐẾN DISK = 'NUL';
ĐI
- Bây giờ, hãy làm nổ tung tệp nhật ký trong giao dịch của chúng tôi
BEGIN GIAO DỊCH
XÁC NHẬN VÀO GIÁ TRỊ DEFAULT Dbo.test;
ĐI 10000
- Các rollback không bao giờ cháy. Thử nó. Bạn sẽ nhận được một lỗi.
- Msg 3903, Cấp 16, Bang 1, Dòng 1
- Yêu cầu GIAO DỊCH ROLLBACK không có GIAO DỊCH BEGIN tương ứng.
GIAO DỊCH ROLLBACK;
- Tệp nhật ký đã đầy đủ 100% chưa?
DBCC SQLPERF (LOGSPACE);
- Có bao nhiêu bản ghi được hiển thị với fn_dblog ()?
LỰA CHỌN *
TỪ fn_dblog (NULL, NULL); - Khoảng 91.926 trong trường hợp của tôi
ĐI
- Tổng dự trữ nhật ký được hiển thị bởi fn_dblog ()?
CHỌN SUM ([Dự trữ nhật ký]) NHƯ [Tổng dự trữ nhật ký]
TỪ fn_dblog (NULL, NULL); - 88,72 MB
ĐI