/// <summary> /// 获得序列 /// </summary> /// <param name="fullName">序列名</param> /// <param name="defaultSequence">默认序列</param> /// <returns>序列实体</returns> protected CiSequenceEntity GetSequenceByLock(string fullName, int defaultSequence) { CiSequenceEntity sequenceEntity = new CiSequenceEntity(); // 这里主要是为了判断是否存在 sequenceEntity = this.GetEntityByName(fullName); if (sequenceEntity == null) { // 这里添加记录时加锁机制。 // 是否已经被锁住 this.ReturnStatusCode = StatusCode.CanNotLock.ToString(); for (int i = 0; i < SystemInfo.LockNoWaitCount; i++) { // 被锁定的记录数 int lockCount = DbCommonLibary.LockNoWait(DBProvider, CiSequenceTable.TableName, CiSequenceTable.FieldFullName, CiSequenceTable.TableName); if (lockCount > 0) { sequenceEntity.FullName = fullName; sequenceEntity.Reduction = defaultSequence - 1; sequenceEntity.Sequence = defaultSequence; sequenceEntity.Step = DefaultStep; this.AddEntity(sequenceEntity); this.ReturnStatusCode = StatusCode.LockOK.ToString(); break; } else { System.Threading.Thread.Sleep(RandomHelper.GetRandom(1, SystemInfo.LockNoWaitTickMilliSeconds)); } } if (this.ReturnStatusCode == StatusCode.LockOK.ToString()) { // XuWangBin 这个是否能省略 sequenceEntity = this.GetEntityByName(fullName); } } else { // 若记录已经存在,加锁,然后读取记录。 // 是否已经被锁住 this.ReturnStatusCode = StatusCode.CanNotLock.ToString(); for (int i = 0; i < SystemInfo.LockNoWaitCount; i++) { // 被锁定的记录数 int lockCount = DbCommonLibary.LockNoWait(DBProvider, CiSequenceTable.TableName, CiSequenceTable.FieldFullName, fullName); if (lockCount > 0) { sequenceEntity = this.GetEntityByName(fullName); this.ReturnStatusCode = StatusCode.LockOK.ToString(); break; } else { System.Threading.Thread.Sleep(RandomHelper.GetRandom(1, SystemInfo.LockNoWaitTickMilliSeconds)); } } } return(sequenceEntity); }