如用户名A,允许这个账号同时登陆5个人
用户名B,允许此账号只能登陆1个人
用户名C,不限,
该如何实现呢
解决另开帖给100分
Class UserManager
{
private static manager;
private Cache cache;
private UserManager()
{
cache = System.Web.HttpContext.Current.Cache;
}
public static UserManager GetInstance()
{
if(manager == null)
manager = new UserManager();
return manager;
}
public bool Login(string username)
{
if(!CanLogin(username))
return false;
cache.Add(...);//使用一个Guid来做key,username做值,这样就可以知道该帐号登陆的用户数。可以设置缓存时间,超时 Cache 会自动删除。
return true;
}
private bool CanLogin(string username)
{
return ...
}
}
1. 在每一个页面开始处理时,将此信息插入数据库。
2. 另有一个表:登录限制,用来保存3分钟之内同一登录名只能同时登录限制数量。后台有一个页面用于设置。
3. 为[登录信息]增加一个insert触发器,检查是否有冲突:
if exists(
select * x.[登录名] from
(select [登录名],count(sessionID) as [并发数量]
from [登录信息] as d
where [当前时间]>dateadd(minute,-3,getdate())
group by [登录名]) as x
inner join [登录限制] as y on x.[登录名]=y.[登录名]
where x.[并发数量]>y.[最大并发数量]
) begin
raiserror(已经达到最大并发数量,请3分钟之后再登录。,16,1)
roollback tran
return
end
如果你不明白触发器的作用,把向[登录信息]表追加记录写入一个存储过程,并且在insert语句之后运行这段代码也可以。
不过存储过程可能被运行也可能不被运行,并且不同流程代码混杂在一起,不如一个个独立的触发器看得清楚,并且触发器可以保证任何时刻只要改写数据就会被执行,不可能被绕开,更好地保持数据库的一致性。