Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
            }
        }