Trong một ứng dụng khác, tôi bị tấn công bởi thiết kế xấu: nhiều luồng thực thi EnsureDatabaseSchemaExists()
đồng thời một phương thức, trông cơ bản như thế này:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
Tuy nhiên, ngay cả khi được thực hiện trong giao dịch SERIALIZABLE, mã này dường như không an toàn cho luồng (tức là mã song song cố gắng tạo bảng nhiều lần). Có bất kỳ cơ hội nào để buộc câu lệnh SELECT thu được một khóa để ngăn chặn một luồng khác thực hiện cùng một câu lệnh SELECT không?
Có một mô hình tốt hơn cho các phương thức đa luồng-SureSchemaExists () không?