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

View File

@ -45,7 +45,7 @@ namespace SqlSugar
#endregion #endregion
#region Global variable #region Global variable
public SqlSugarProvider Context { get => GetContext();} public SqlSugarProvider Context { get => GetContext(); }
public bool IsSystemTablesConfig => this.Context.IsSystemTablesConfig; public bool IsSystemTablesConfig => this.Context.IsSystemTablesConfig;
public ConnectionConfig CurrentConnectionConfig { get => _CurrentConnectionConfig; set => _CurrentConnectionConfig = value; } public ConnectionConfig CurrentConnectionConfig { get => _CurrentConnectionConfig; set => _CurrentConnectionConfig = value; }
public Guid ContextID { get => this.Context.ContextID; set => this.Context.ContextID = value; } public Guid ContextID { get => this.Context.ContextID; set => this.Context.ContextID = value; }
@ -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(); return result;
CallContext.ContextList.Value.Add(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(); return result;
CallContext.ContextList.Value.Add(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()
{ {