Tôi vấp phải tình huống thay đổi kiến thức về giao dịch và khóa cơ bản (mặc dù tôi không biết nhiều) và tôi cần giúp đỡ để hiểu nó.
Hãy nói rằng tôi có một bảng như thế này:
CREATE TABLE [dbo].[SomeTable](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[SomeData] [varchar](200) NOT NULL,
[Moment] [datetime] NOT NULL,
[SomeInt] [bigint] NOT NULL
) ON [PRIMARY]
và tôi chạy truy vấn "chèn 1000 hàng trong một giao dịch":
BEGIN TRAN t1
DECLARE @i INT = 0
WHILE @i < 1000
BEGIN
SET @i = @i + 1
INSERT INTO [SomeTable] ([SomeData] ,Moment, SomeInt)
VALUES (CONVERT(VARCHAR(255), NEWID()), getdate(), @i)
WAITFOR DELAY '00:00:00:010'
END
COMMIT TRAN t1
Trong khi giao dịch này đang chạy, tôi đang thực hiện một lựa chọn đơn giản:
SELECT Id, Moment, SomeData, SomeInt FROM [SomeTable]
Không phải lúc nào cũng có thể sao chép nó (rõ ràng phụ thuộc vào thời gian) nhưng đôi khi chọn truy vấn sẽ, sau khi chèn giao dịch kết thúc, trả về ít hơn 1000 hàng. Trong sự thiếu hiểu biết của tôi, tôi đã tin rằng select sẽ luôn trả về 1000 hàng (với mức độ cô lập là Read Cam kết), nhưng rõ ràng tôi đã hiểu sai về cách giao dịch và khóa hoạt động.
Tuy nhiên, nếu tôi đặt khóa chính trên cột Id (tạo chỉ mục được nhóm), hãy chọn truy vấn, miễn là tôi đã thử, trả về tất cả 1000 hàng. Đặt chỉ mục theo một cách khác, với chỉ mục được nhóm trên khóa tổng hợp và chỉ mục không được phân cụm trên một số cột khác, một lần nữa có thể dẫn đến việc trả lại số lượng hàng ít hơn tôi dự kiến.
Vì vậy, tôi có những câu hỏi sau:
- Tại sao chọn không luôn trả về tất cả các hàng được cam kết bởi giao dịch?
- Nếu đây là hành vi được mong đợi, cách tốt nhất để thực sự làm cho nó hoạt động như tôi mong đợi là gì? Về cơ bản, tôi muốn chọn trả về trạng thái của bảng sau (hoặc trước) giao dịch, chứ không phải một số dữ liệu được thực hiện một nửa. Ảnh chụp cách ly hiện không phải là một lựa chọn. Đặt TABLOCK dường như đang thực hiện công việc, nhưng có một giải pháp tốt hơn? Trong cuộc sống thực, tôi có các bảng mà tôi sẽ không muốn khóa ở cấp độ này nếu nó không thực sự cần thiết.
- Tại sao đặt một chỉ số thay đổi hành vi này?
Cảm ơn trước.