Tengo un proceso que se ejecuta con múltiples hilos.Bloqueos de inserción de tabla de base de datos desde una aplicación de múltiples hilos
El proceso tiene una colección segura de subprocesos de elementos para el proceso.
Cada subproceso procesa los elementos de la colección en un bucle.
Cada elemento de la lista se envía a un procedimiento almacenado por el hilo para insertar datos en 3 tablas en una transacción (en sql). Si una inserción falla, las tres fallan. Tenga en cuenta que el alcance de la transacción es por artículo.
Las inserciones son bastante simples, simplemente insertando una fila (relacionada con la clave externa) en cada tabla, con semillas de identidad. No hay lectura, solo inserte y luego avance al siguiente elemento.
Si tengo varios subprocesos que intentan procesar sus propios elementos y cada uno intenta insertarlos en el mismo conjunto de tablas, ¿esto creará interbloqueos, tiempos de espera o cualquier otro problema debido a bloqueos de transacciones?
Sé que tengo que usar una conexión db por hilo, me preocupan principalmente los niveles de bloqueo de las tablas en cada transacción. Cuando un hilo está insertando filas en las 3 tablas, ¿los otros hilos tendrán que esperar? No hay dependencia de filas por tabla, excepto que la identificación automática necesita ser incrementada. Si se trata de un bloqueo de nivel de tabla para incrementar la identidad, entonces supongo que otros hilos tendrán que esperar. Las inserciones pueden o no ser rápidas a veces. Si va a tener que esperar, ¿tiene sentido hacer subprocesamiento múltiple?
El objetivo del multihilo es acelerar el procesamiento de los artículos.
Por favor, comparta su experiencia.
PD: Identity seed no es un GUID.
¿Son estos procedimientos almacenados realmente largos? – CodingGorilla
¿Por qué no usa BULK INSERT? Esto ** realmente ** acelera el proceso de inserción. – Dennis
No, solo estarán insertando y listo cuando se trata de la base de datos. No es un proceso pesado, en el peor caso digamos 10 segundos por transacción. En su mayoría, será como 1 o 2 segundos. –