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 ()?
Rekomendasi saya adalah melakukan upaya / tangkapan terbaik. Tangani kasus duplikat secara eksplisit, jika perlu, mis. abaikan itu...
Pertanyaan sebenarnya: mengapa DDL berjalan berdasarkan permintaan, dari banyak xacts? Biasanya pemutakhiran dan migrasi adalah masalah serius, ditangani di jendela waktu khusus ... Anda tidak ingin migrasi Anda (kode-pertama?) Tiba-tiba muncul, beberapa langkah pembaruan itu bisa memakan waktu berjam-jam di meja besar (ukuran-of) operasi data ...)
sumber
CREATE TABLE
hibah untuk operasi normal ...