This commit is contained in:
sunkaixuan 2019-05-20 08:49:31 +08:00
parent 0abc60ec2b
commit 411431e167

View File

@ -671,31 +671,37 @@ namespace SqlSugar
#region Helper #region Helper
private SqlSugarProvider GetContext() private SqlSugarProvider GetContext()
{ {
if (IsOnleySharedSameThread()) if (IsSameThreadAndShard())
return SharedSameThread(); return SameThreadAndShard();
else if (IsSingleAndSharedThread()) else if (IsNoSameThreadAndShard())
return SingleAndSharedThread(); return NoSameThreadAndShard();
else if (IsSynchronization()) else if (IsSynchronization())
return Synchronization(); return Synchronization();
else else
return Single(); return NoSameThread();
} }
private SqlSugarProvider Single() private SqlSugarProvider NoSameThread()
{ {
if (CallContext.ContextList.Value == null) if (CallContext.ContextList.Value == null)
{
CallContext.ContextList.Value = new List<SqlSugarProvider>();
}
if (CallContext.ContextList.Value.IsNullOrEmpty() || GetCallContext() == null)
{ {
var context = CopyClient(); var context = CopyClient();
CallContext.ContextList.Value.Add(context); AddCallContext(context);
return context; return context;
} }
else else
{ {
return GetCallContext(); var result = GetCallContext();
if (result == null)
{
var copy = CopyClient();
AddCallContext(copy);
return copy;
}
else
{
return result;
}
} }
} }
@ -708,67 +714,65 @@ namespace SqlSugar
return _Context; return _Context;
} }
private SqlSugarProvider SingleAndSharedThread() private SqlSugarProvider NoSameThreadAndShard()
{ {
SqlSugarProvider result = _Context;
if (CallContext.ContextList.Value.IsNullOrEmpty()) if (CallContext.ContextList.Value.IsNullOrEmpty())
{ {
var copy = CopyClient();
CallContext.ContextList.Value = new List<SqlSugarProvider>(); AddCallContext(copy);
CallContext.ContextList.Value.Add(_Context); return copy;
} }
else else
{ {
SqlSugarProvider cacheContext = GetCallContext(); var result = GetCallContext();
if (cacheContext != null) if (result == null)
{ {
result = cacheContext; var copy = CopyClient();
AddCallContext(copy);
return copy;
} }
else else
{ {
result = CopyClient();
CallContext.ContextList.Value.Add(result);
}
}
return result; return result;
} }
}
}
private SqlSugarProvider SharedSameThread() private SqlSugarProvider SameThreadAndShard()
{ {
SqlSugarProvider result = _Context;
if (CallContext.ContextList.Value.IsNullOrEmpty()) if (CallContext.ContextList.Value.IsNullOrEmpty())
{ {
AddCallContext(_Context);
CallContext.ContextList.Value = new List<SqlSugarProvider>(); return _Context;
CallContext.ContextList.Value.Add(_Context);
} }
else else
{ {
SqlSugarProvider cacheContext = GetCallContext(); var result = GetCallContext();
if (cacheContext != null) if (result == null)
{ {
result = cacheContext; var copy = CopyClient();
AddCallContext(copy);
return copy;
} }
else else
{ {
result = CopyClient();
CallContext.ContextList.Value.Add(result);
}
}
return result; return result;
} }
}
}
private bool IsSynchronization() private bool IsSynchronization()
{ {
return _ThreadId == Thread.CurrentThread.ManagedThreadId.ToString(); return _ThreadId == Thread.CurrentThread.ManagedThreadId.ToString();
} }
private bool IsSingleAndSharedThread() private bool IsNoSameThreadAndShard()
{ {
return CurrentConnectionConfig.IsShardSameThread && _ThreadId != Thread.CurrentThread.ManagedThreadId.ToString(); return CurrentConnectionConfig.IsShardSameThread && _ThreadId != Thread.CurrentThread.ManagedThreadId.ToString();
} }
private bool IsOnleySharedSameThread() private bool IsSameThreadAndShard()
{ {
return CurrentConnectionConfig.IsShardSameThread && _ThreadId == Thread.CurrentThread.ManagedThreadId.ToString(); return CurrentConnectionConfig.IsShardSameThread && _ThreadId == Thread.CurrentThread.ManagedThreadId.ToString();
} }
@ -783,6 +787,11 @@ namespace SqlSugar
return result; return result;
} }
private void AddCallContext(SqlSugarProvider context)
{
CallContext.ContextList.Value = new List<SqlSugarProvider>();
CallContext.ContextList.Value.Add(context);
}
private SqlSugarProvider GetCallContext() private SqlSugarProvider GetCallContext()
{ {