Skip to content

Commit 29fe8b4

Browse files
committed
Use ambient transaction in bulk loader. Fixes #300
1 parent 35a47b5 commit 29fe8b4

File tree

2 files changed

+74
-4
lines changed

2 files changed

+74
-4
lines changed

src/MySqlConnector/MySql.Data.MySqlClient/MySqlBulkLoader.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ public sealed class MySqlBulkLoader
2222
public List<string> Columns { get; }
2323
public MySqlBulkLoaderConflictOption ConflictOption { get; set; }
2424
public MySqlConnection Connection { get; set; }
25-
public MySqlTransaction Transaction { get; set; }
2625
public char EscapeCharacter { get; set; }
2726
public List<string> Expressions { get; }
2827
public char FieldQuotationCharacter { get; set; }
@@ -60,7 +59,6 @@ public MySqlBulkLoader(MySqlConnection connection)
6059
ConflictOption = MySqlBulkLoaderConflictOption.None;
6160
Columns = new List<string>();
6261
Expressions = new List<string>();
63-
Transaction = connection.CurrentTransaction;
6462
}
6563

6664
private string BuildSqlCommand()
@@ -186,11 +184,11 @@ private async Task<int> LoadAsync(IOBehavior ioBehavior, CancellationToken cance
186184
closeConnection = true;
187185
Connection.Open();
188186
}
189-
187+
190188
try
191189
{
192190
var commandString = BuildSqlCommand();
193-
var cmd = new MySqlCommand(commandString, Connection, Transaction)
191+
var cmd = new MySqlCommand(commandString, Connection, Connection.CurrentTransaction)
194192
{
195193
CommandTimeout = Timeout,
196194
};

tests/SideBySide/BulkLoaderSync.cs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,42 @@ public void BulkLoadLocalCsvFileInTransactionWithCommit()
245245
}
246246
}
247247

248+
[Fact]
249+
public void BulkLoadLocalCsvFileBeforeTransactionWithCommit()
250+
{
251+
try
252+
{
253+
m_database.Connection.Open();
254+
var bulkLoader = new MySqlBulkLoader(m_database.Connection)
255+
{
256+
FileName = AppConfig.MySqlBulkLoaderLocalCsvFile,
257+
TableName = m_testTable,
258+
CharacterSet = "UTF8",
259+
NumberOfLinesToSkip = 1,
260+
FieldTerminator = ",",
261+
FieldQuotationCharacter = '"',
262+
FieldQuotationOptional = true,
263+
Local = true,
264+
};
265+
bulkLoader.Expressions.Add("five = UNHEX(five)");
266+
bulkLoader.Columns.AddRange(new[] { "one", "two", "three", "four", "five" });
267+
268+
using (var transaction = m_database.Connection.BeginTransaction())
269+
{
270+
var rowCount = bulkLoader.Load();
271+
Assert.Equal(20, rowCount);
272+
273+
transaction.Commit();
274+
}
275+
276+
Assert.Equal(20, m_database.Connection.ExecuteScalar<int>($@"select count(*) from {m_testTable};"));
277+
}
278+
finally
279+
{
280+
m_database.Connection.Close();
281+
}
282+
}
283+
248284
[Fact]
249285
public void BulkLoadLocalCsvFileInTransactionWithRollback()
250286
{
@@ -281,6 +317,42 @@ public void BulkLoadLocalCsvFileInTransactionWithRollback()
281317
}
282318
}
283319

320+
[Fact]
321+
public void BulkLoadLocalCsvFileBeforeTransactionWithRollback()
322+
{
323+
try
324+
{
325+
m_database.Connection.Open();
326+
var bulkLoader = new MySqlBulkLoader(m_database.Connection)
327+
{
328+
FileName = AppConfig.MySqlBulkLoaderLocalCsvFile,
329+
TableName = m_testTable,
330+
CharacterSet = "UTF8",
331+
NumberOfLinesToSkip = 1,
332+
FieldTerminator = ",",
333+
FieldQuotationCharacter = '"',
334+
FieldQuotationOptional = true,
335+
Local = true,
336+
};
337+
bulkLoader.Expressions.Add("five = UNHEX(five)");
338+
bulkLoader.Columns.AddRange(new[] { "one", "two", "three", "four", "five" });
339+
340+
using (var transaction = m_database.Connection.BeginTransaction())
341+
{
342+
var rowCount = bulkLoader.Load();
343+
Assert.Equal(20, rowCount);
344+
345+
transaction.Rollback();
346+
}
347+
348+
Assert.Equal(0, m_database.Connection.ExecuteScalar<int>($@"select count(*) from {m_testTable};"));
349+
}
350+
finally
351+
{
352+
m_database.Connection.Close();
353+
}
354+
}
355+
284356
[Fact]
285357
public void BulkLoadMissingFileName()
286358
{

0 commit comments

Comments
 (0)