Threads vs ProcessBatch

02/10/2006 - 14:33 por Estrategix | Informe spam
Hola Gustavo,

Tengo una serie de dudas bastante grande con respecto al uso de Threads en
vez de usar elementos Batch que Sharepoint recomienda para Inserciones y
actualizaciones masivas de datos.

Intentaré resumir la problemática:

Actualmente en un mismo poyecto estamos trabajando conjuntamente 2 empresas:
empresa A que somos nosotros y la empresa B que es de Madrid.

La empresa B ha ralizado un webpart de aprobación de facturas, resulta que
para que el proceso de aprobación se reduzca en tiempo han utilizado Threads
de la Framework .net 1.1.

Bien es sabido que Sharepoint recomienda usar procesos Batch para realizar
inserciones y actualizaciones masivas.

En realidad lo que hace ese webpart es lanzar un thread por factura que
existen en una lista, al finalizar las tareas del webpart se ejecuta un
procedimiento almacenado que permite actualizar una Base de Datos de SAGE (
aplicacion de contabilidad ), pues bien:

El problema reside en que se están produciendo Bloqueos en la BBDD ( sql
server 2000 ) te paso el mensaje de error:

////////////////////////////////////////////////////////////////////
Función ActualizaERP con SQL: declare @NumeroFactura nvarchar(17)declare
@CIFProveedor nvarchar(20)declare @Estado nvarchar(17)declare @URLSite
nvarchar(255)set @NumeroFactura = 'F-2006-59'set @CIFProveedor =
'A48035901'set @Estado = 'Aprobada'set @URLSite =
'http://srvsps/sites/facturascoop/Li...m.aspx?IDT'EXECUTE
sp_IWFL_UPDEstadoFacturas @NumeroFactura, @CIFProveedor, @Estado, @URLSite Ha
provocado este error --> Exception: La transacción (Id. de proceso 52) quedó
en interbloqueo en lock recursos con otro proceso y fue elegida como sujeto
del interbloqueo. Ejecute de nuevo la transacción.
facturascoop/Lists/AprobadasUN/DispForm.aspx?IDT
Sep 27 2006 5:32PM[ at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at NPS.Webparts.Utilities.ActualizaERP(String cadenaConexion, String
sitioDestino, String listaDestino, String sitioDestinoRechazadas, String
listaDestinoRechazadas, SPListItem Item, String strEstadoERP)]

/////////////////////////////////////////////////////////////////////////

lo que el mensaje nos da en cuestión es lo siguiente:

Exception: La transacción (Id. de proceso 52) quedó en interbloqueo en lock
recursos con otro proceso y fue elegida como sujeto del interbloqueo. Ejecute
de nuevo la transacción.

ya que al parecer se está intentando llamar al mismo procedimiento a la vez
por dos procesos.

Además hemos notado que en algunos casos las tareas que se ejecutan dentro
del webpart no todas se ejecutan correctamente, si no que en algun momento
algunas no se llegan a ejecutar, lo que produce que las facturas se pierdan y
no se puedan recuperar de ninguna forma.

Puede darse el caso que el uso de Threads en vez de procesos Batch esté
generando este problema??


La BBDD nos avisa de manera correcta que se ha producido el interbloqueo y
la información que he encontrado en internet nos dice que varios procesos
están intentando acceder al mismo recurso por lo que la BBDD para la
ejecución de unos de esos procesos hasta que pueda estar libre para el
siguiente.

T e ha pasado alguna vez algo como esto o similar ?? sabes alguna otra
opción que pudieramos considerar, estamos ciegos y no sabemos como resolver
esta situación.

Al cliente l he reiterado que el uso de Threads no es lo mas corriente,
debido a que a veces nop trabajan como deberían, pero desde microsoft nos
recomiendan usar los procesos batch que te he comentado y que en su SDK viene
recogido como algo importate a tener en cuenta.

Muchas gracias y un saludo.
 

Leer las respuestas

#1 Gustavo
02/10/2006 - 21:12 | Informe spam
Hola,
Primero que todo, te agradezco que me dirijas la pregunta directamente a mi
(supongo que yo soy el "Gustavo" al que te refieres), pero, como este es un
grupo publico en donde todo el mundo puede meter la cucharada, seria mas
elegante dirigirlo a todos los participantes y no a mi solamente.
En cuanto a tu pregunta, casi todos los metodos del Modelo de Objetos de
SharePoint son "thread safe", excepto los que estan expresamente marcados
como (copiado del SDK) "...Any public static (Shared in Microsoft Visual
Basic) members of this type are safe for multithreaded operations. Any
instance members are not guaranteed to be thread safe..."
Yo tendria mas la tendencia a pensar que el problema ocurre en la Base de
Datos, por una u otra configuracion de ella, o por algun problema en su
estructura. Mis conocimientos de SQL no son suficientes para darte una idea
mas precisa, pero probablemente en el Foro de SQL te pueden ayudar mas.
Procesamiento en batch es recomendado en SharePoint cuando hay que
introducir o modificar grandes cantidades de elementos en Listas o Librerias,
como indica el articulo "Manejo en grupo (Batch) de Elementos de Listas"
(http://www.gavd.net/servers/sharepo...itm"0).
Suerte,
Gustavo
http://www.gavd.net/servers/default.aspx
http://geeks.ms/blogs/gvelez/


"Estrategix" wrote:

Hola Gustavo,

Tengo una serie de dudas bastante grande con respecto al uso de Threads en
vez de usar elementos Batch que Sharepoint recomienda para Inserciones y
actualizaciones masivas de datos.

Intentaré resumir la problemática:

Actualmente en un mismo poyecto estamos trabajando conjuntamente 2 empresas:
empresa A que somos nosotros y la empresa B que es de Madrid.

La empresa B ha ralizado un webpart de aprobación de facturas, resulta que
para que el proceso de aprobación se reduzca en tiempo han utilizado Threads
de la Framework .net 1.1.

Bien es sabido que Sharepoint recomienda usar procesos Batch para realizar
inserciones y actualizaciones masivas.

En realidad lo que hace ese webpart es lanzar un thread por factura que
existen en una lista, al finalizar las tareas del webpart se ejecuta un
procedimiento almacenado que permite actualizar una Base de Datos de SAGE (
aplicacion de contabilidad ), pues bien:

El problema reside en que se están produciendo Bloqueos en la BBDD ( sql
server 2000 ) te paso el mensaje de error:

////////////////////////////////////////////////////////////////////
Función ActualizaERP con SQL: declare @NumeroFactura nvarchar(17)declare
@CIFProveedor nvarchar(20)declare @Estado nvarchar(17)declare @URLSite
nvarchar(255)set @NumeroFactura = 'F-2006-59'set @CIFProveedor =
'A48035901'set @Estado = 'Aprobada'set @URLSite =
'http://srvsps/sites/facturascoop/Li...m.aspx?IDT'EXECUTE
sp_IWFL_UPDEstadoFacturas @NumeroFactura, @CIFProveedor, @Estado, @URLSite Ha
provocado este error --> Exception: La transacción (Id. de proceso 52) quedó
en interbloqueo en lock recursos con otro proceso y fue elegida como sujeto
del interbloqueo. Ejecute de nuevo la transacción.
facturascoop/Lists/AprobadasUN/DispForm.aspx?IDT
Sep 27 2006 5:32PM[ at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at NPS.Webparts.Utilities.ActualizaERP(String cadenaConexion, String
sitioDestino, String listaDestino, String sitioDestinoRechazadas, String
listaDestinoRechazadas, SPListItem Item, String strEstadoERP)]

/////////////////////////////////////////////////////////////////////////

lo que el mensaje nos da en cuestión es lo siguiente:

Exception: La transacción (Id. de proceso 52) quedó en interbloqueo en lock
recursos con otro proceso y fue elegida como sujeto del interbloqueo. Ejecute
de nuevo la transacción.

ya que al parecer se está intentando llamar al mismo procedimiento a la vez
por dos procesos.

Además hemos notado que en algunos casos las tareas que se ejecutan dentro
del webpart no todas se ejecutan correctamente, si no que en algun momento
algunas no se llegan a ejecutar, lo que produce que las facturas se pierdan y
no se puedan recuperar de ninguna forma.

Puede darse el caso que el uso de Threads en vez de procesos Batch esté
generando este problema??


La BBDD nos avisa de manera correcta que se ha producido el interbloqueo y
la información que he encontrado en internet nos dice que varios procesos
están intentando acceder al mismo recurso por lo que la BBDD para la
ejecución de unos de esos procesos hasta que pueda estar libre para el
siguiente.

T e ha pasado alguna vez algo como esto o similar ?? sabes alguna otra
opción que pudieramos considerar, estamos ciegos y no sabemos como resolver
esta situación.

Al cliente l he reiterado que el uso de Threads no es lo mas corriente,
debido a que a veces nop trabajan como deberían, pero desde microsoft nos
recomiendan usar los procesos batch que te he comentado y que en su SDK viene
recogido como algo importate a tener en cuenta.

Muchas gracias y un saludo.

Preguntas similares