Skip to content

Commit 30f2a4d

Browse files
Fix | Fix Bulk Copy Async deadlock with custom IDataReader using SqlDataReader internally. (#779)
1 parent a7545de commit 30f2a4d

File tree

2 files changed

+57
-39
lines changed

2 files changed

+57
-39
lines changed

src/Microsoft.Data.SqlClient/netcore/src/Microsoft/Data/SqlClient/SqlBulkCopy.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,6 +1159,11 @@ private Task ReadFromRowSourceAsync(CancellationToken cts)
11591159
}
11601160
else
11611161
{ // This will call Read for DataRows, DataTable and IDataReader (this includes all IDataReader except DbDataReader)
1162+
// Release lock to prevent possible deadlocks
1163+
SqlInternalConnectionTds internalConnection = _connection.GetOpenTdsConnection();
1164+
bool semaphoreLock = internalConnection._parserLock.CanBeReleasedFromAnyThread;
1165+
internalConnection._parserLock.Release();
1166+
11621167
_hasMoreRowToCopy = false;
11631168
try
11641169
{
@@ -1175,6 +1180,10 @@ private Task ReadFromRowSourceAsync(CancellationToken cts)
11751180
throw;
11761181
}
11771182
}
1183+
finally
1184+
{
1185+
internalConnection._parserLock.Wait(canReleaseFromAnyThread: semaphoreLock);
1186+
}
11781187
return null;
11791188
}
11801189
}

0 commit comments

Comments
 (0)