Một giải pháp đơn giản mà tôi đã triển khai trong một ứng dụng ....
CREATE TABLE RecordLocks(
[RecordId] [varchar](8) NOT NULL,
[UserName] [varchar](100) NOT NULL,
[datetimestamp] [smalldatetime] NOT NULL,
[PC] [varchar](100) NOT NULL
)
GO
datetimestamp
có mặc định là GetDate()
RecordId
là một VARCHAR
vì khóa chính trong bảng mà tôi đang khóa (không phải lựa chọn của tôi). Ngoài ra, bảng này có các chỉ mục rõ ràng
CREATE PROCEDURE usp_LockRecord @RecordId VARCHAR(8), @UserName VARCHAR(100), @ComputerName VARCHAR(100)
AS
BEGIN
BEGIN TRAN;
DELETE FROM RecordLocks WHERE DATEDIFF(HOUR, datetimestamp, GETDATE()) > 2;
IF NOT EXISTS (Select * from RecordLocks WHERE RecordId = @RecordId)
INSERT INTO RecordLocks (RecordId, username, PC) VALUES (@RecordId, @UserName, @ComputerName);
Select * from RecordLocks WHERE RecordId = @RecordId;
COMMIT TRAN;
END
GO
Lần đầu tiên xóa và ghi lại các bản ghi cũ hơn 2 giờ (thay đổi cho phù hợp)
Kiểm tra xem không có bản ghi nào đã khóa cái cần khóa và nếu không hãy lắp khóa.
Chọn bản ghi với RecordId mà chúng tôi quan tâm.
Sau đó trong phần kiểm tra mã gọi điện để xem khóa đã thành công hay chưa. Nếu tên người dùng và PC quay lại từ lựa chọn khớp với dữ liệu vừa được chuyển vào khóa thì đã thành công. Nếu tên người dùng trùng khớp nhưng PC không cùng người dùng thì bản ghi sẽ được mở trên một máy khác. nếu tên người dùng không khớp với người dùng khác đã mở nó. Tôi hiển thị thông báo cho người dùng nếu I.E của nó không thành công Bản ghi này hiện đang bị khóa bởi JoeB trên máy trạm XYZ.
Khi người dùng lưu bản ghi hoặc điều hướng đi, chỉ cần xóa khóa bản ghi.
Tôi chắc chắn rằng có những cách khác nhưng điều này hoạt động tốt cho tôi.
Cập nhật
Bản ghi sẽ chỉ được chèn nếu một bản ghi không tồn tại. Lựa chọn sau sẽ trả về một bản ghi. Nếu tên người dùng và / hoặc máy tính khác với dữ liệu bạn cố gắng chèn bản ghi đã bị khóa bởi một người dùng khác (hoặc cùng một người dùng trên một máy khác). Vì vậy, một cuộc gọi làm tất cả (có thể nói như vậy). Vì vậy, nếu tôi thực hiện cuộc gọi Exec usp_LockRecord(1234, 'JoeB', 'Workstation1')
và bản ghi tôi lấy lại khớp với dữ liệu mà tôi đã khóa thành công bản ghi đó. Nếu tên người dùng và / hoặc PC tôi lấy lại khác thì hồ sơ đã bị khóa. Sau đó, tôi có thể hiển thị thông báo cho người dùng thông báo rằng bản ghi đã bị khóa, đặt các trường chỉ đọc, tắt các nút lưu và cho họ biết ai có khóa trên đó nếu tôi muốn.