Tôi có một yêu cầu để theo dõi hành động khóa / mở khóa của các đối tượng. Trước khi bất kỳ hành động nào được thực hiện trên một đối tượng (hợp đồng, đối tác, v.v.), một lock
sự kiện được đưa ra. Sau khi hành động kết thúc, nó đưa ra unlock
sự kiện.
Tôi muốn có được những đối tượng đã bị khóa nhưng chưa được mở khóa. Mục tiêu là làm cho truy vấn nhanh chóng và tránh bế tắc.
Dưới đây là bảng
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)
Tôi sử dụng truy vấn bên dưới để phản đối các đối tượng chưa được mở khóa:
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)
Nó hoạt động chính xác và kết quả a
, b
và d
.
Câu hỏi của tôi là: - Giải pháp của tôi có đủ để tránh bế tắc không? Có bất kỳ vấn đề có thể xảy ra nếu có rất nhiều INSERT
trong quá trình thực hiện truy vấn? - Bạn có cách nào khác (tốt hơn) để giải quyết điều này không?
CẬP NHẬT
Tôi xin lỗi vì đã không đặt bối cảnh vào câu hỏi. Thiết kế cơ sở dữ liệu ở trên không phải để thay thế khóa cơ sở dữ liệu.
Chúng tôi có một hệ thống bên ngoài mà chúng tôi gọi nó từ hệ thống của chúng tôi. Nó yêu cầu gọi lock
và unlock
phương thức trên hệ thống của họ trước mỗi hành động thực hiện trên một đối tượng (có thể là hợp đồng hoặc đối tác).
Gần đây, chúng tôi có tình huống máy chủ gặp sự cố và chúng tôi phải khởi động lại nó. Thật không may, các quy trình đang chạy lock
đã không có cơ hội gọi unlock
để giải phóng các đối tượng, do đó dẫn đến một số vấn đề khác khi hệ thống của chúng tôi kết nối lại với bên ngoài.
Vì vậy, chúng tôi muốn cung cấp một khả năng để theo dõi từng lock
cuộc gọi. Khi khởi động lại máy chủ, chúng tôi sẽ gọi unlock
các đối tượng đã bị khóa trước đó.
Cảm ơn Remus Rusanu đã chỉ ra rằng câu hỏi của tôi đang sử dụng nguyên mẫu DDL. Đây là lần đầu tiên tôi đăng câu hỏi lên DBA và tôi xin lỗi vì đã không đọc FAQ.
Cảm ơn