En general los deadlock se producen por:
1. Errores de diseño, sea en procesos T-SQL batch, procedures, triggers, gestión de transacciones o modelo ER. Si este es el caso, tendrás deadlocks muy seguido, y como ya comentaron, deberás identificar que lo genera, el SQL Server Profiler puede ser muy útil, más info en http://msdn.microsoft.com/en-us/library/ms188246.aspx y http://msdn.microsoft.com/en-us/library/ms178104.aspx
2. Concurrencia, es muy poco probable que sea por una alta concurrencia de usuarios, pero posible. Si este es el caso, rara vez tendrás un deadlock, podrías analizar el problema, pero teniendo en cuenta que el motor resuelve los deadlock con consistencia, puede ser mas práctico ignorar el error y volver a ejecutar el proceso. ”
Hacen falta guías buenas de “troubleshooting” como https://es.slideshare.net/SolidQ/troubleshooting-de-bloqueos-2016
var
policy = Policy
.Handle<SqlException(e => e.Number == 1205 ||
e.Number == 1204 ...)
// Handling deadlock victim
.Or<OtherException>()
.Retry(3, (exception, retyCount, context) =>
{
// Log...
});
public static T Retry<T>(Func<T> func)
{
int count = 3;
TimeSpan delay = TimeSpan.FromSeconds(5);
while (true)
{
try
{
return func();
}
catch (SqlException ex)
{
--count;
if (count <= 0) throw;
var dbex = new DatabaseException(ex.Message, ex);
if (dbex.ExceptionInformation.MayRetry)
_log.Debug("Deadlock, retrying", e);
else
throw;
Thread.Sleep(delay);
}
}
}
La clave es cómo encontrar "qué" está locking-blocking mis tablas.
Saludos.
public static void PreserveStackTrace(Exception ex)
{
MethodInfo preserveStackTrace = typeof(Exception).GetMethod("InternalPreserveStackTrace", BindingFlags.Instance | BindingFlags.NonPublic);
preserveStackTrace.Invoke(ex, null);
IsolationLevel.Serializable ' Valor por defecto
Log
El procesosuele funcionar, da problemas cuando llegan más de 1000 registros en el CSV, algo que ocurre en la BBDD a ciertas hora, y hace que la inserción de registros sea lentísima y acabe fallando la transacción.
Aún partiendoel fichero en más pequeños, sigue dando error, no llega ni insertar 60 registros y da el error antes mencionado.