예제 #1
0
파일: RpcContext.cs 프로젝트: 775083111/GMS
        /// <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);
        }
예제 #2
0
파일: RpcContext.cs 프로젝트: 775083111/GMS
        /// <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;
            }
        }