Saya memiliki persyaratan untuk melacak tindakan mengunci / membuka kunci objek. Sebelum tindakan apa pun dilakukan pada suatu objek (kontrak, mitra, dll), suatu lock
peristiwa dikeluarkan. Setelah tindakan selesai, itu mengeluarkan unlock
acara.
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
, b
dan d
.
Pertanyaan saya adalah: - Apakah solusi saya cukup memadai untuk menghindari kebuntuan? Apakah ada masalah yang dapat terjadi jika ada banyak INSERT
selama 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 lock
dan unlock
metode 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 lock
tidak memiliki kesempatan untuk memanggil unlock
untuk melepaskan objek, sehingga menyebabkan beberapa masalah lain ketika sistem kami terhubung lagi ke yang eksternal.
Jadi kami ingin memberikan kemampuan untuk melacak setiap lock
panggilan. Setelah me-restart server, kita akan memanggil unlock
objek 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
sumber