PDA

Ver la Versión Completa : AllowPageLocks


RaulChemical
07-02-2006, 10:54:45
Hola!!!!


Tengo un problemilla sobre bloqueos de pagina en SQLServer.

Al dar de alta datos desde la ventana principal de la aplicacion, insertamos registros en 10 tablas y en 7 de ellas, se lanza un trigger que inserta datos en otras 7 tablas paralelas a estas.

El problema que tengo es que cuando ejecuto las inserts, se me produce un bloqueo de pagina en cada una de las tablas, tanto en las 10 que yo trato desde la aplicacion, como en las otras 7 que saltan desde los triggers.

Me he estado documentando, y he encontrado una instruccion para que no bloquee estas tablas:

"EXEC sp_indexoption 'TABLA.PK_TABLA', AllowPageLocks, False".

He ejecutado la instruccion para cada una de las 17 tablas y he conseguido evitar el bloqueo de 10 de ellas (por suerte son las tablas que se auto insertan con los triggers y otras 3 mas), pero sigo teniendo otras 7 tablas que siguen estando bloqueadas a pesar de haber metido mi famosa instruccion.

żSabeis alguna forma de evitar esos bloqueos o si existe alguna otra forma de evitar bloqueos de pagina sin ejecutar el "EXEC sp_indexoption"?

El problema está llegando a ser cada vez mas agobiante dado que cada vez tenemos mas registros en las tablas y tengo al cliente un poco mosqueado.

Muchas gracias a todos.


Raul.

Xianto
07-02-2006, 12:00:58
Imagino que no te estas conectando a MsSql con ADO.

Si lo estas haciendo, al menos yo, no tengo idea como ayudarte con la información que estas dando.

Pero si te dire, que antes de usar ADO, hace tiempo ya, tenia algun problema de bloqueos que nunca pude corregir... Por eso cambie a ADO y nunca más tuve problemas de bloqueos.

Saludos !

RaulChemical
07-02-2006, 12:06:33
Usamos ADO para conectarme a SQLServer2000.

Cuando insertamos en las tablas, usamos un .append, rellenamos campos y luego hacemos un .post.

Xianto
07-02-2006, 12:26:50
Claro lo que pasa es que trabajamos de formas distintas...

Al iniciar la aplicación declaro un AdoCommand y a lo largo de toda la aplicación lo utilizo para insertar datos... algo como:


var
index: integer;
i: string;
begin
i := 'Insert into tabla xxxxxxxxxx values (xxxxxxx)';
ADOComm.CommandText := i;
ADOComm.Execute(index);
end


Me da la impresión que al declarar un objeto table y abrir la tabla para luego hacer un .append, ahí el ADO te esta generando un bloqueo, dado que estas insertando y que al existir un trigger en el SQL que necesita esos datos, se produce un error... Pero te repito, nunca he trabajado así, por lo cual solo estoy imaginando lo que puede pasar.

Espero que alguien más te pueda ayudar con el problema...

RaulChemical
07-02-2006, 12:39:07
Desde el visor de trazas de SQLServer he visto lo que hace por dentro el componente ADO que uso, justo en el momento de hacer el .Post se crea una "Insert into NoSeDonde Values (...)" que se ejecuta en la base de datos. El servidor, al recibir la insert, lanza el Trigger (after insert) y me genera los bloqueos de pagina.

Mi problema no es de la aplicacion cliente, si no de servidor, de ahi lo de "EXEC sp_indexoption 'TABLA.PK_TABLA', AllowPageLocks, False".

De todas formas, Xianto, muchas gracias por tu interes. En futuras versiones de la aplicacion propondré hacer las inserts con SQL, no con append y post.

Muchas Gracias de nuevo.