/// <summary> /// 在当前上下文中获取一个分布式锁,第一个获取锁的将执行依赖当前key的完整业务流程(包括多个微服务之间的调用和数据库的访问) /// 后来者将无法获取锁,根据返回的结果来判断是否进入流程,如果返回的锁为null将不能执行下面的流程,要么重试等待锁释放,要么返回错误 /// var qtLock=TryGetLock(lockKey); /// if(qtLock==null) 提示不能同时执行操作; return; /// else 进行业务流程 /// 最后别忘了 qtLock.ReleaseLock(); /// </summary> /// <param name="lockKey">要锁定的key,这里可以是单据号,或者业务中不允许并行处理的业务key</param> /// <param name="timeOut">获取等待时间,如果锁被占用,等待释放的时间,默认不等待</param> /// <param name="autoReleaseTime">自动释放的时间,建议用默认值</param> /// <returns></returns> public DistributedLock TryGetLock(string lockKey, int timeOut = 0, int autoReleaseTime = 60 * 1000) { var l = GrantLockManager.TryGetLock(lockKey, timeOut, autoReleaseTime); if (l == null) { return(null); } locks.Add(l); return(l); }
/// <summary> /// 释放的时候就不锁了,因为只有框架在释放,外部业务类看不到 /// </summary> public void Dispose() { locks.ForEach(x => { GrantLockManager.ReleaseLock(x); }); if (dbContexts != null && dbContexts.Count > 0) { foreach (var db in dbContexts.Keys) { var ctx = dbContexts[db]; if (ctx != null) { ctx.Dispose(); } } dbContexts.Clear(); dbContexts = null; } }