/// <summary> /// 只能添加一次。 /// </summary> /// <param name="key"></param> /// <param name="r"></param> internal void AddRecordAccessed(Record.RootInfo root, RecordAccessed r) { if (IsCompleted) { throw new Exception("Transaction Is Completed"); } r.InitRootInfo(root, null); accessedRecords.Add(root.TableKey, r); }
private CheckResult _check_(bool writeLock, RecordAccessed e) { if (writeLock) { switch (e.OriginRecord.State) { case GlobalCacheManager.StateRemoved: // fall down case GlobalCacheManager.StateInvalid: return(CheckResult.RedoAndReleaseLock); // 写锁发现Invalid,肯定有Reduce请求。 case GlobalCacheManager.StateModify: return(e.Timestamp != e.OriginRecord.Timestamp ? CheckResult.Redo : CheckResult.Success); case GlobalCacheManager.StateShare: // 这里可能死锁:另一个先获得提升的请求要求本机Recude,但是本机Checkpoint无法进行下去,被当前事务挡住了。 // 通过 GlobalCacheManager 检查死锁,返回失败;需要重做并释放锁。 if (e.OriginRecord.Acquire(GlobalCacheManager.StateModify) != GlobalCacheManager.StateModify) { logger.Warn("Acquire Faild. Maybe DeadLock Found {0}", e.OriginRecord); e.OriginRecord.State = GlobalCacheManager.StateInvalid; return(CheckResult.RedoAndReleaseLock); } e.OriginRecord.State = GlobalCacheManager.StateModify; return(e.Timestamp != e.OriginRecord.Timestamp ? CheckResult.Redo : CheckResult.Success); } return(e.Timestamp != e.OriginRecord.Timestamp ? CheckResult.Redo : CheckResult.Success); // imposible } else { if (e.OriginRecord.State == GlobalCacheManager.StateInvalid || e.OriginRecord.State == GlobalCacheManager.StateRemoved) { return(CheckResult.RedoAndReleaseLock); // 发现Invalid,肯定有Reduce请求或者被Cache清理,此时保险起见释放锁。 } return(e.Timestamp != e.OriginRecord.Timestamp ? CheckResult.Redo : CheckResult.Success); } }