From 17241be66d2d754c483c85a3b491ca6458f3af55 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 15 Nov 2019 16:36:34 +0800 Subject: [PATCH] debug UnitOfWork Destructor #131 --- FreeSql.DbContext/DbContext/DbContext.cs | 2 +- .../CommonProvider/AdoProvider/AdoProviderTransaction.cs | 7 ++++--- FreeSql/Internal/CommonProvider/CodeFirstProvider.cs | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index f2913f53..88ef9f85 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -221,7 +221,7 @@ namespace FreeSql AllSets.Clear(); if (_isUseUnitOfWork) - UnitOfWork?.Rollback(); + UnitOfWork?.Dispose(); } finally { diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs index a2b807dd..8ed0c1e2 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs @@ -1,6 +1,7 @@ using SafeObjectPool; using System; using System.Collections.Generic; +using System.Collections.Concurrent; using System.Data.Common; using System.Diagnostics; using System.Linq; @@ -27,7 +28,7 @@ namespace FreeSql.Internal.CommonProvider } } - private Dictionary _trans = new Dictionary(); + private ConcurrentDictionary _trans = new ConcurrentDictionary(); private object _trans_lock = new object(); public DbTransaction TransactionCurrentThread => _trans.TryGetValue(Thread.CurrentThread.ManagedThreadId, out var conn) && conn.Transaction?.Connection != null ? conn.Transaction : null; @@ -54,7 +55,7 @@ namespace FreeSql.Internal.CommonProvider if (_trans.ContainsKey(tid)) CommitTransaction(); lock (_trans_lock) - _trans.Add(tid, tran); + _trans.TryAdd(tid, tran); } private void AutoCommitTransaction() @@ -74,7 +75,7 @@ namespace FreeSql.Internal.CommonProvider if (_trans.ContainsKey(tran.Conn.LastGetThreadId)) lock (_trans_lock) if (_trans.ContainsKey(tran.Conn.LastGetThreadId)) - _trans.Remove(tran.Conn.LastGetThreadId); + _trans.TryRemove(tran.Conn.LastGetThreadId, out var oldtran); Exception ex = null; var f001 = isCommit ? "提交" : "回滚"; diff --git a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs index 1f00f176..3ecb796a 100644 --- a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs +++ b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs @@ -58,13 +58,13 @@ namespace FreeSql.Internal.CommonProvider static object syncStructureLock = new object(); object _dicSycedLock = new object(); - Dictionary> _dicSynced = new Dictionary>(); + ConcurrentDictionary> _dicSynced = new ConcurrentDictionary>(); internal ConcurrentDictionary _dicSycedGetOrAdd(Type entityType) { if (_dicSynced.TryGetValue(entityType, out var trydic) == false) lock (_dicSycedLock) if (_dicSynced.TryGetValue(entityType, out trydic) == false) - _dicSynced.Add(entityType, trydic = new ConcurrentDictionary()); + _dicSynced.TryAdd(entityType, trydic = new ConcurrentDictionary()); return trydic; } internal void _dicSycedTryAdd(Type entityType, string tableName = null) =>