Saya memiliki persyaratan untuk melacak tindakan mengunci / membuka kunci objek. Sebelum tindakan apa pun dilakukan pada suatu objek (kontrak, mitra, dll), suatu lockperistiwa dikeluarkan. Setelah tindakan selesai, itu mengeluarkan unlockacara.
Saya ingin mendapatkan benda-benda yang terkunci tetapi belum dibuka. Tujuannya adalah untuk membuat kueri cepat dan untuk menghindari kebuntuan.
Di bawah ini adalah tabelnya
create table locks (
id int identity,
name varchar(255),
lock int
)
insert into locks values('a', 1)
insert into locks values('b', 1)
insert into locks values('c', 1)
insert into locks values('d', 1)
insert into locks values('a', 0)
insert into locks values('c', 0)
insert into locks values('a', 1)
insert into locks values('b', 1)
Saya menggunakan kueri di bawah ini untuk menolak objek yang belum dibuka:
select distinct m.name from locks m
where (select COUNT(id) from locks locked
where locked.lock = 1 and locked.name = m.name)
> (select COUNT(id) from locks unlocked
where unlocked.lock = 0 and unlocked.name = m.name)
Ini berfungsi dengan benar dan hasilnya a, bdan d.
Pertanyaan saya adalah: - Apakah solusi saya cukup memadai untuk menghindari kebuntuan? Apakah ada masalah yang dapat terjadi jika ada banyak INSERTselama eksekusi permintaan? - Apakah Anda punya cara lain (lebih baik) untuk menyelesaikan ini?
MEMPERBARUI
Saya minta maaf karena tidak memasukkan konteks ke dalam pertanyaan. Desain basis data di atas bukan untuk menggantikan penguncian basis data.
Kami memiliki sistem eksternal yang kami sebut dari sistem kami. Ini membutuhkan panggilan lockdan unlockmetode pada sistem mereka sebelum setiap tindakan dilakukan pada suatu objek (bisa berupa kontrak atau mitra).
Baru-baru ini, kami memiliki situasi sedemikian rupa sehingga server lumpuh dan kami harus memulai ulang. Sayangnya, proses yang berjalan yang sudah dipanggil locktidak memiliki kesempatan untuk memanggil unlockuntuk melepaskan objek, sehingga menyebabkan beberapa masalah lain ketika sistem kami terhubung lagi ke yang eksternal.
Jadi kami ingin memberikan kemampuan untuk melacak setiap lockpanggilan. Setelah me-restart server, kita akan memanggil unlockobjek yang sebelumnya terkunci.
Terima kasih Remus Rusanu karena menunjukkan bahwa pertanyaan saya menggunakan prototipe DDL. Ini adalah pertama kalinya saya memposting pertanyaan di DBA dan saya minta maaf karena tidak membaca FAQ.
Terima kasih