Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   transacciones (https://www.clubdelphi.com/foros/showthread.php?t=14409)

Alessan 20-09-2004 13:55:57

transacciones
 
Hola,

como hago para efectuar una transaccion a nivel de registro (no me bloquee la tabla) desde una conexion ADO sobre un sqlserver? El 'begintrans' me bloquea la tabla a la pimera modificacion.

Un Saludo y gracias.

Neftali [Germán.Estévez] 20-09-2004 14:25:21

Busca información en SQL Server sobre "Isolation Level" y "Locking Hints". Existen modificadores de una sentencia SQL como ROWLOCK (aunque no te puedo dar más info pq no he llegado a utilizarlos).
De todas formas y sin saber más sobre lo que estás programando, yo te diría que no deberías bloquear ni tablas ni registros en un SQL Server (por norma general); Si tienes ésta necesidad es que tal vez no estés realizando las cosas correctamente (ojo, digo por norma general, todo depende de cada caso...)
Si nos das más info. tal vez haya otra forma de hacer las cosas sin bloquear.

Alessan 20-09-2004 16:02:40

Hola,

Gracias por tu respuesta.
No es que necesite bloquear, es que tengo ke actualizar dos registros de tablas diferentes en una transaccion (actualizar los dos o ninguno y mostrar error).

le echare un vistazo a la documentacion del sqlserver.

Un Saludo.

Neftali [Germán.Estévez] 20-09-2004 16:16:41

Cita:

Empezado por Alessan
No es que necesite bloquear, es que tengo ke actualizar dos registros de tablas diferentes en una transaccion (actualizar los dos o ninguno y mostrar error).

Eso justamente es lo que te hará la transacción, no debes preocuparte de bloqueos. Si usas el Isolation Level por defecto debe funcionar.

Alessan 20-09-2004 17:11:08

Hola,

Se que eso es lo que hace una transaccion, el problema es que se me bloquea la tabla mientras que la transaccion esta activa.

Puedo leer los registros usando NOLOCK en la clausula FROM de la consulta de seleccion, pero lo que me gustaría es poder actualizar otros registros (bloqueo a nivel de fila) mientras la transaccion aun no terminó.

El programa ejecuta estas transacciones unas 70 veces por minuto en hilos diferentes, pero no puede actualizar un registro hasta que termina la transaccion anterior..... ese es el problema (la transaccion queda en cola esperando que finalize la anterior).

Supuestamente con la Clausula WITH (ROWLOCK) deberia bloquear solo los registros utilizados en la consulta de actualizacion, pero me bloquea la tabla completa para escritura.

Es decir si ejecuto:

Código SQL [-]
  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
  go
  begin tran
  update AA with (rowlock)
  set IDAA = '1' 
  where IDAA = '29'

y sin finalizar la transaccion ejecuto:

Código SQL [-]
  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
  go
  begin tran
  update AA with (rowlock)
  set IDAA = '2' 
  where IDAA = '30'

Siendo IDAA clave primaria, la segunda consulta no se ejcuta mientras no haga un commit o un rollback de la primera transaccion.

¿Alguna Sugerencia?

Un Saludo.

guillotmarc 20-09-2004 17:23:58

Hola.

Lamentablemente mi experiencia es muy mala con los bloqueos de SQL Server. Por más que la documentación de SQL Server 7 indicaba que los bloqueos són a nivel de registro, a mi también me quedaba totalmente bloqueada la tabla. Siempre sospeché que los culpables eran los bloqueos de índice que tambien se generan (como puedes comprobar en el Administrador Corporativo, en Administración, Actividad Actual).

Debido a estos problemas, abandoné practicamente la utilización de transacciones en SQL Server (usandolas solo en los casos más imprescindibles, y intentando que fueran cuanto más cortas mejor). Pasándome finalmente a Interbase (Firebird en concreto) que maneja esplendidamente las transacciones.

Saludos.


La franja horaria es GMT +2. Ahora son las 01:10:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi