Di aplikasi lain saya dikejutkan oleh desain yang buruk: beberapa thread menjalankan EnsureDatabaseSchemaExists()
metode secara bersamaan, yang pada dasarnya terlihat seperti ini:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
Namun, bahkan jika dieksekusi dalam transaksi SERIALIZABLE, kode ini tampaknya tidak aman-thread (yaitu kode paralel mencoba membuat tabel beberapa kali). Apakah ada peluang untuk memaksa pernyataan SELECT untuk mendapatkan kunci yang mencegah utas lain untuk melakukan pernyataan SELECT yang sama?
Apakah ada pola yang lebih baik untuk metode multi-threaded-EnsureSchemaExists ()?