Skip to content

Commit 92885e7

Browse files
committed
- 修复 BulkCopy 与线程事务未传播的 bug;#962
1 parent 9bd6e83 commit 92885e7

File tree

4 files changed

+54
-36
lines changed

4 files changed

+54
-36
lines changed

Providers/FreeSql.Provider.Dameng/DamengExtensions.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,19 @@ public static void ExecuteDmBulkCopy<T>(this IInsert<T> that, DmBulkCopyOptions
4848
{
4949
if (insert.InternalConnection == null && insert.InternalTransaction == null)
5050
{
51-
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
52-
{
53-
using (var bulkCopy = copyOptions == DmBulkCopyOptions.Default ?
54-
new DmBulkCopy(conn.Value as DmConnection) :
55-
new DmBulkCopy(conn.Value as DmConnection, copyOptions, insert.InternalTransaction as DmTransaction))
56-
{
51+
if (insert._orm.Ado?.TransactionCurrentThread != null)
52+
using (var bulkCopy = new DmBulkCopy(insert._orm.Ado.TransactionCurrentThread.Connection as DmConnection, copyOptions, insert._orm.Ado.TransactionCurrentThread as DmTransaction))
5753
writeToServer(bulkCopy);
54+
else
55+
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
56+
{
57+
using (var bulkCopy = copyOptions == DmBulkCopyOptions.Default ?
58+
new DmBulkCopy(conn.Value as DmConnection) :
59+
new DmBulkCopy(conn.Value as DmConnection, copyOptions, insert.InternalTransaction as DmTransaction))
60+
{
61+
writeToServer(bulkCopy);
62+
}
5863
}
59-
}
6064
}
6165
else if (insert.InternalTransaction != null)
6266
{

Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,11 @@ public static void ExecuteMySqlBulkCopy<T>(this IInsert<T> that, int? bulkCopyTi
5050
{
5151
if (insert.InternalConnection == null && insert.InternalTransaction == null)
5252
{
53-
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
54-
{
55-
writeToServer(new MySqlBulkCopy(conn.Value as MySqlConnection));
56-
}
53+
if (insert._orm.Ado?.TransactionCurrentThread != null)
54+
writeToServer(new MySqlBulkCopy(insert._orm.Ado.TransactionCurrentThread.Connection as MySqlConnection, insert._orm.Ado?.TransactionCurrentThread as MySqlTransaction));
55+
else
56+
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
57+
writeToServer(new MySqlBulkCopy(conn.Value as MySqlConnection));
5758
}
5859
else if (insert.InternalTransaction != null)
5960
{
@@ -109,10 +110,11 @@ async public static Task ExecuteMySqlBulkCopyAsync<T>(this IInsert<T> that, int?
109110
{
110111
if (insert.InternalConnection == null && insert.InternalTransaction == null)
111112
{
112-
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
113-
{
114-
await writeToServer(new MySqlBulkCopy(conn.Value as MySqlConnection));
115-
}
113+
if (insert._orm.Ado?.TransactionCurrentThread != null)
114+
await writeToServer(new MySqlBulkCopy(insert._orm.Ado.TransactionCurrentThread.Connection as MySqlConnection, insert._orm.Ado?.TransactionCurrentThread as MySqlTransaction));
115+
else
116+
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
117+
await writeToServer(new MySqlBulkCopy(conn.Value as MySqlConnection));
116118
}
117119
else if (insert.InternalTransaction != null)
118120
{

Providers/FreeSql.Provider.Oracle/OracleExtensions.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,19 @@ public static void ExecuteOracleBulkCopy<T>(this IInsert<T> that, OracleBulkCopy
4848
{
4949
if (insert.InternalConnection == null && insert.InternalTransaction == null)
5050
{
51-
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
52-
{
53-
using (var bulkCopy = copyOptions == OracleBulkCopyOptions.Default ?
54-
new OracleBulkCopy(conn.Value as OracleConnection) :
55-
new OracleBulkCopy(conn.Value as OracleConnection, copyOptions))
56-
{
51+
if (insert._orm.Ado?.TransactionCurrentThread != null)
52+
using (var bulkCopy = new OracleBulkCopy(insert._orm.Ado.TransactionCurrentThread.Connection as OracleConnection, copyOptions))
5753
writeToServer(bulkCopy);
54+
else
55+
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
56+
{
57+
using (var bulkCopy = copyOptions == OracleBulkCopyOptions.Default ?
58+
new OracleBulkCopy(conn.Value as OracleConnection) :
59+
new OracleBulkCopy(conn.Value as OracleConnection, copyOptions))
60+
{
61+
writeToServer(bulkCopy);
62+
}
5863
}
59-
}
6064
}
6165
else if (insert.InternalTransaction != null)
6266
{

Providers/FreeSql.Provider.SqlServer/SqlServerExtensions.cs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,19 @@ public static void ExecuteSqlBulkCopy<T>(this IInsert<T> that, SqlBulkCopyOption
9292
{
9393
if (insert.InternalConnection == null && insert.InternalTransaction == null)
9494
{
95-
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
96-
{
97-
using (var bulkCopy = copyOptions == SqlBulkCopyOptions.Default ?
98-
new SqlBulkCopy(conn.Value as SqlConnection) :
99-
new SqlBulkCopy(conn.Value as SqlConnection, copyOptions, null))
100-
{
95+
if (insert._orm.Ado?.TransactionCurrentThread != null)
96+
using (var bulkCopy = new SqlBulkCopy(insert._orm.Ado.TransactionCurrentThread.Connection as SqlConnection, copyOptions, insert._orm.Ado.TransactionCurrentThread as SqlTransaction))
10197
writeToServer(bulkCopy);
98+
else
99+
using (var conn = insert.InternalOrm.Ado.MasterPool.Get())
100+
{
101+
using (var bulkCopy = copyOptions == SqlBulkCopyOptions.Default ?
102+
new SqlBulkCopy(conn.Value as SqlConnection) :
103+
new SqlBulkCopy(conn.Value as SqlConnection, copyOptions, null))
104+
{
105+
writeToServer(bulkCopy);
106+
}
102107
}
103-
}
104108
}
105109
else if (insert.InternalTransaction != null)
106110
{
@@ -167,15 +171,19 @@ async public static Task ExecuteSqlBulkCopyAsync<T>(this IInsert<T> that, SqlBul
167171
{
168172
if (insert.InternalConnection == null && insert.InternalTransaction == null)
169173
{
170-
using (var conn = await insert.InternalOrm.Ado.MasterPool.GetAsync())
171-
{
172-
using (var bulkCopy = copyOptions == SqlBulkCopyOptions.Default ?
173-
new SqlBulkCopy(conn.Value as SqlConnection) :
174-
new SqlBulkCopy(conn.Value as SqlConnection, copyOptions, null))
175-
{
174+
if (insert._orm.Ado?.TransactionCurrentThread != null)
175+
using (var bulkCopy = new SqlBulkCopy(insert._orm.Ado.TransactionCurrentThread.Connection as SqlConnection, copyOptions, insert._orm.Ado.TransactionCurrentThread as SqlTransaction))
176176
await writeToServerAsync(bulkCopy);
177+
else
178+
using (var conn = await insert.InternalOrm.Ado.MasterPool.GetAsync())
179+
{
180+
using (var bulkCopy = copyOptions == SqlBulkCopyOptions.Default ?
181+
new SqlBulkCopy(conn.Value as SqlConnection) :
182+
new SqlBulkCopy(conn.Value as SqlConnection, copyOptions, null))
183+
{
184+
await writeToServerAsync(bulkCopy);
185+
}
177186
}
178-
}
179187
}
180188
else if (insert.InternalTransaction != null)
181189
{

0 commit comments

Comments
 (0)