private bool CheckTimeout(DbLuceneLock dbLock) { DateTime now = DateTime.UtcNow; if (dbLock.ExpireTimeUTC < now) { return(true); } return(false); }
public override void Release() { DbLuceneLock dbLock = _db.LuceneLockSet.SingleOrDefault(obj => obj.LockName.Equals(_lockName) && obj.LockSource.Equals(_srcGuid)); if (dbLock == null) { return; } _db.LuceneLockSet.Remove(dbLock); _db.SaveChanges(); }
public override bool IsLocked() { // Check lockName only. The lock may be from another source. DbLuceneLock dbLock = _db.LuceneLockSet.SingleOrDefault(obj => obj.LockName.Equals(_lockName)); if (dbLock == null) { return(false); } // If the lock is timeout. Just release it. bool timeout = CheckTimeout(dbLock); if (timeout) { return(false); } return(true); }
/// <summary> /// DbLuceneLock啟用Optimistic Locking的機制。如果該lock object有多個人修改,會造成Exception。以此處理concurrency的問題。 /// </summary> /// <returns></returns> public override bool Obtain() { DbLuceneLock dbLock = _db.LuceneLockSet.SingleOrDefault(obj => obj.LockName.Equals(_lockName)); if (dbLock != null && CheckTimeout(dbLock) == false) { return(false); } if (dbLock == null) { dbLock = new DbLuceneLock(_lockName); dbLock.LockSource = _srcGuid; dbLock.ExpireTimeUTC = DateTime.UtcNow.Add(_expireOffset); _db.LuceneLockSet.Add(dbLock); _db.SaveChanges(); return(true); } dbLock.LockSource = _srcGuid; dbLock.ExpireTimeUTC = DateTime.UtcNow.Add(_expireOffset); _db.SaveChanges(); return(true); }