Triệu chứng

Khi bạn sử dụng hàm SCOPE_IDENTITY() hoặc hàm @@IDENTITYđể truy xuất giá trị được chèn vào cột định danh, bạn có thể nhận thấy rằng đôi khi các hàm này trả về giá trị không chính xác. Sự cố chỉ xảy ra khi truy vấn của bạn sử dụng kế hoạch thực thi song song. Để biết thêm thông tin về cách xác định xem truy vấn của bạn có sử dụng kế hoạch thực thi song song hay không, hãy tham khảo phần Song song truy vấn Intra-query trong bài viết kỹ thuật sau về Các bản tải xuống của Microsoft:

Nguyên nhân

Microsoft đã xác nhận rằng đây là một sự cố trong các sản phẩm Microsoft được liệt kê ở đầu bài viết này.

Giải pháp

Thông tin cập nhật tích lũy

SQL Server 2008 R2 Gói Dịch vụ 1

Bản sửa lỗi cho sự cố này được phát hành lần đầu trong Bản cập nhật Tích lũy 5 dành cho SQL Server 2008 R2 Gói Dịch vụ 1. Để biết thêm thông tin về cách nhận gói cập nhật tích lũy này, hãy bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Tri thức Microsoft: 

2659694Gói Cập nhật Tích lũy 5 cho SQL Server 2008 R2 Gói Dịch vụ 1

Lưu ý Vì các bản dựng này tích lũy nên mỗi bản phát hành bản sửa lỗi mới đều chứa tất cả hotfix và tất cả các bản sửa lỗi bảo mật có trong bản phát hành sửa lỗi SQL Server 2008 R2 trước đó. Chúng tôi khuyên bạn nên cân nhắc việc áp dụng bản phát hành bản sửa lỗi mới nhất có chứa hotfix này. Để biết thêm thông tin, hãy bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:

2567616Các bản dựng SQL Server 2008 R2 được phát hành sau khi phát hành SQL Server 2008 R2 Gói Dịch vụ 1

Cách giải quyết

Microsoft khuyên bạn không nên sử dụng một trong hai hàm này trong truy vấn của mình khi các kế hoạch song song có liên quan vì chúng không phải lúc nào cũng đáng tin cậy. Thay vào đó, hãy sử dụng mệnh đề OUTPUT của câu lệnh INSERT để truy xuất giá trị định danh như minh họa trong ví dụ dưới đây.

Ví dụ về cách sử dụng mệnh đề OUTPUT:

DECLARE @MyNewIdentityValues table(myidvalues int)
khai báo @A bảng (ID int khóa chính)
chèn vào @A giá trị (1)
khai báo @B (ID int primary key identity(1,1), B int not null)
chèn vào giá @B (1)
chọn
    [RowCount] = @@RowCount,
    [@@IDENTITY] = @@IDENTITY,
    [SCOPE_IDENTITY] = SCOPE_IDENTITY()

đặt hồ sơ thống kê trên
chèn vào hộp _ddr_T
đầu ra inserted.ID vào @MyNewIdentityValues
    chọn
            
b.ID         từ @A a
            nối trái @B b trên b.ID = 1
            nối trái @B b2 trên b2. B = -1

            nối trái _ddr_T t trên t.T = -1

        where not exists (select * from _ddr_T t2 where t2.ID = -1)
tắt đặt hồ sơ thống kê

chọn
    [RowCount] = @@RowCount,
    [@@IDENTITY] = @@IDENTITY,
    [SCOPE_IDENTITY] = SCOPE_IDENTITY(),
    [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
chọn * từ @MyNewIdentityValues
truy cập

Nếu tình huống của bạn yêu cầu bạn phải sử dụng một trong hai hàm này, bạn có thể sử dụng một trong các phương pháp sau đây để giải quyết vấn đề.

Phương pháp 1:

Bao gồm tùy chọn sau đây trong truy vấn của bạn

OPTION (MAXDOP 1)

Lưu ý: Điều này có thể ảnh hưởng đến hiệu suất của phần SELECT trong truy vấn của bạn.

Phương pháp 2:

Đọc giá trị từ phần SELECT thành một tập hợp các biến số (hoặc một biến số bảng duy nhất), rồi chèn vào bảng đích với MAXDOP=1. Vì kế hoạch INSERT sẽ không song song, bạn sẽ nhận được ngữ âm phù hợp, nhưng SELECT của bạn sẽ song song để đạt được hiệu năng mong muốn.

Phương pháp 3:

Chạy câu lệnh sau đây để đặt mức độ tối đa của tùy chọn song song thành 1:

sp_configure 'độ song song tối đa', 1

truy cập

tái cấu hình với ghi đè

truy cập

Lưuý : Phương pháp này có thể làm giảm hiệu suất trên máy chủ. Bạn không nên sử dụng phương pháp này trừ khi bạn đã đánh giá phương pháp trong môi trường thử nghiệm, hoặc staging.

Thông tin Bổ sung

Lỗi Kết nối của Microsoft về sự cố

Độ Song song Tối đa (MAXDOP)https://msdn.microsoft.com/en-us/library/ms181007.aspx

Bạn cần thêm trợ giúp?

Phát triển các kỹ năng của bạn
Khám phá nội dung đào tạo
Sở hữu tính năng mới đầu tiên
Tham gia Microsoft dùng nội bộ

Thông tin này có hữu ích không?

Bạn hài lòng đến đâu với chất lượng dịch thuật?
Điều gì ảnh hưởng đến trải nghiệm của bạn?

Cảm ơn phản hồi của bạn!

×