Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-09-2004
Alessan Alessan is offline
Registrado
 
Registrado: jun 2004
Posts: 5
Poder: 0
Alessan Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 20-09-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.281
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 20-09-2004
Alessan Alessan is offline
Registrado
 
Registrado: jun 2004
Posts: 5
Poder: 0
Alessan Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 20-09-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.281
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 20-09-2004
Alessan Alessan is offline
Registrado
 
Registrado: jun 2004
Posts: 5
Poder: 0
Alessan Va por buen camino
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.

Última edición por Alessan fecha: 20-09-2004 a las 17:19:11.
Responder Con Cita
  #6  
Antiguo 20-09-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).

Última edición por guillotmarc fecha: 20-09-2004 a las 17:26:15.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:35:30.


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
Copyright 1996-2007 Club Delphi