我需要一些关于如何实现记录多个用户在应用程序中执行操作的基本机制的建议。当另一个功能正在运行时,我需要更改应用程序,以限制功能。
用例示例 用户可以正常编辑未付费记录。如果应用程序然后运行Payrun进程(Long),我需要更改应用程序的某些部分以在短时间内限制功能(例如,只读取现有的未付费记录)。
有关如何在.net应用程序中执行此操作的任何建议吗?
架构详细信息
该解决方案是一个只读的外联网报告应用程序和内部(防火墙)数据输入和数据处理应用程序(小单输入和大批量导入数据)。
答案 0 :(得分:1)
通常我们在数据库层中处理它,因为不同计算机上的各个应用程序不能直接相互识别。应用程序可以在执行操作之前或定期检查数据库本身,或者底层存储过程可以使用某种简单的表来管理模态并锁定信号量。
在单个服务器上的非分布式Web应用程序上,您可以使用Application对象轻松处理这个问题,因为确实有一个应用程序,它可以非常轻松地监视用户活动。
假设您只有两种模式,所有内容都在存储过程中处理:
一个用户在进行某种POSTING操作和NORMAL模式的模式。让我们假设POSTING操作中的操作相对简单,为了清楚起见,我们将省略代码以确保没有竞争条件,并且所有代码都是内联的,而不是封装到其他SP或函数中:
CREATE PROCEDURE Post
AS
BEGIN
UPDATE ModeControl
SET Mode = 'POSTING'
UPDATE Payments
SET Whatever = whatever
WHERE whatever
UPDATE ModeControl
SET Mode = 'NORMAL'
END
CREATE PROCEDURE IsPosting -- poll this in your app or before performing operations
AS
BEGIN
IF EXISTS (SELECT * FROM ModeControl WHERE Model = 'POSTING')
RETURN 1
ELSE
RETURN 0
END
CREATE PROCEDURE Normal1
AS
BEGIN
-- Catches potential problems at database even though app shouldn't call in 'POSTING' more
IF EXISTS (SELECT * FROM ModeControl WHERE Model = 'POSTING')
RAISERROR...
-- Perform Normal1 operations
END
CREATE PROCEDURE Normal2
AS
BEGIN
IF EXISTS (SELECT * FROM ModeControl WHERE Model = 'POSTING')
RAISERROR...
-- Perform Normal2 operations
END
显然,如果你有一个完整的数据访问层和一些框架位,你可以装饰你的方法并使用反射来自动分类你的方法,并用不完整模式的检查包装它们,将它绑定到某种状态 - 机器式的东西。