Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Loqueos datos select (SQL 2008)

Estas en el tema de Loqueos datos select (SQL 2008) en el foro de SQL Server en Foros del Web. Buenas para todos, Tengo una duda, como puedo loquear una serie de registros que devuelve una instrucción select. Paso a detallar un poco mas. A ...
  #1 (permalink)  
Antiguo 28/09/2010, 10:25
Avatar de gustavoh10  
Fecha de Ingreso: diciembre-2005
Ubicación: ARGENTINA
Mensajes: 196
Antigüedad: 18 años, 4 meses
Puntos: 3
Loqueos datos select (SQL 2008)

Buenas para todos,

Tengo una duda, como puedo loquear una serie de registros que devuelve una instrucción select.

Paso a detallar un poco mas.

A partir de datos que cargo en un select se disparan un serie de inserts, lo que quiero prevenir es que 2 o mas usuario no disparen los inserts sobre el mismo conjunto de datos.

Por eso quiero loquear para que nadie pueda leer los datos que tomo el select hasta que termine la transacción.

Creo que llegue a una solución pero no es lo mas optimo, supongo que se puede hacer mejor.

Código

Transacción 1
Código:
use db

begin transaction
select * from tabla with (XLOCK)

commit transaction
Transaccion 2 (leyendo los datos que tomo la transacción 1

Código:
use db

begin transaction
select * from tabla

commit transaction
Con esto, hasta que no termine el select de la transacción 1, la transacción 2 no comienza a realizar el select.-

En la DB estoy usan ReadCommitted con ALLOW_SNAPSHOT_ISOLATION*en ON


Espero que me puedan sugerir como llegar a hacer esto de una mejor forma.

Saludos!
  #2 (permalink)  
Antiguo 28/09/2010, 10:42
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Loqueos datos select (SQL 2008)

Primero, no se dice LOQUEAR, suena como a "volverlos locos", se dice "BLOQUEAR" (de bloqueo).

Segundo, ya hicimos el comentario en este mismo foro, que puedes colocar un campo tipo BOLEANO que actualices a 1 (ocupado) o 0 (libre), para realizar tus movimientos.
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 28/09/2010, 10:47
Avatar de gustavoh10  
Fecha de Ingreso: diciembre-2005
Ubicación: ARGENTINA
Mensajes: 196
Antigüedad: 18 años, 4 meses
Puntos: 3
Respuesta: Loqueos datos select (SQL 2008)

Cita:
Iniciado por iislas Ver Mensaje
Primero, no se dice LOQUEAR, suena como a "volverlos locos", se dice "BLOQUEAR" (de bloqueo).

Segundo, ya hicimos el comentario en este mismo foro, que puedes colocar un campo tipo BOLEANO que actualices a 1 (ocupado) o 0 (libre), para realizar tus movimientos.
jajaj perdón por lo de loquear, es un termino que solo yo debo usar jajaja!

esta buena la idea de poner un campo booleano, para saber eso. pero supongo que sql server tienen que tener algo para que sea automático (yo encontré el table hint que use arriba, ahora estoy leyendo sobre eso)

gracias!
  #4 (permalink)  
Antiguo 28/09/2010, 12:11
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Loqueos datos select (SQL 2008)

Ahi nos cuentas como te fue.....
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 29/09/2010, 05:03
Avatar de gustavoh10  
Fecha de Ingreso: diciembre-2005
Ubicación: ARGENTINA
Mensajes: 196
Antigüedad: 18 años, 4 meses
Puntos: 3
Respuesta: Loqueos datos select (SQL 2008)

Cita:
Iniciado por iislas Ver Mensaje
Ahi nos cuentas como te fue.....
La forma que encontré es usar el nivel de aislamiento serializable en la transacción y poner el hint xlock a la consulta, esto permite lograr lo que buscaba, pero, mientras esta corriendo la transacción no puedo hacer inserts, pero si updates.

saludos!
  #6 (permalink)  
Antiguo 29/09/2010, 10:36
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Loqueos datos select (SQL 2008)

Muestranos tu codigo....

Aunque por lo visto, tendrias "lecturas sucias".
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 29/09/2010, 13:46
Avatar de gustavoh10  
Fecha de Ingreso: diciembre-2005
Ubicación: ARGENTINA
Mensajes: 196
Antigüedad: 18 años, 4 meses
Puntos: 3
Respuesta: Loqueos datos select (SQL 2008)

Hasta donde entiendo no creo que tenga lecturas sucias.

te paso una porción del código, igual ya me di cuenta que lo encaré mal al problema y no creo que me sirva la solución que encontré

Primer select de la transacción
Código:
SELECT * FROM TABLATEMPORAL WITH 
WHERE ORIGEN = 1
AND SUCUR = 6
AND DEPTO = 135
los datos que yo tengo en este select, quiero que queden bloqueados hasta que termine la transacción.

Paso a explicar con mas detalle.

Básicamente esta es una tabla temporal que almacena datos ya calculados.

Cuando se ejecuta la primera vez, el programa partiendo de un dato, busca si este tiene relaciones ascendente o descendentes e inserta los registros en la tabla temporal.

Luego de terminar el select se hace una comparación entre esta tabla (temporal) y otra tabla (originadora), si se encuentra una diferencia en el campo de fecha de modificación, para ese registro se disparan muchos select que buscan relaciones en otras tablas (relaciones ascendentes y descendentes).

Entonces creeamos esta tabla temporal para agilizar los tiempos de respuesta ya que buscamos sola las relaciones de los registros que cambian.

El problema se da si dos usuarios al mismo tiempo ejecutan el mismo programa, tenemos un problema que se duplican los registros en la tabla temporal (solo cuando se ejecuta la primera vez)

Entonces se me ocurrio mantener bloquada la tabla temporal hasta que termine la transacción que la crea la primera vez (que se cargar todos los registros).

Una vez que esta creada esta tabla, ya no es tanto problema, se actualizan los datos necesarios, y si se corren 2 o 3 vences al mismo tiempo no es problema.

El problema es que no puede hacer un bloqueo de los registos del select que puse en el comienzo.

Perdón si en el primer post no me explique como debia.

Gracias por tus comentarios.




Cita:
Iniciado por iislas Ver Mensaje
Muestranos tu codigo....

Aunque por lo visto, tendrias "lecturas sucias".
  #8 (permalink)  
Antiguo 29/09/2010, 21:52
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Loqueos datos select (SQL 2008)

Pues estas muy equivocado, las tablas TEMPORALES, solo pertenecen al SPID que las creo, esto es, si tu proceso crea una tabla temporal llamada #Tabla_Temporal, por cada SPID que ejecute en el momento dicho proceso, se creara una tabla con el mismo nombre, solo que le añade el SPID.
__________________
MCTS Isaias Islas
  #9 (permalink)  
Antiguo 30/09/2010, 04:29
Avatar de gustavoh10  
Fecha de Ingreso: diciembre-2005
Ubicación: ARGENTINA
Mensajes: 196
Antigüedad: 18 años, 4 meses
Puntos: 3
Respuesta: Loqueos datos select (SQL 2008)

Cita:
Iniciado por iislas Ver Mensaje
Pues estas muy equivocado, las tablas TEMPORALES, solo pertenecen al SPID que las creo, esto es, si tu proceso crea una tabla temporal llamada #Tabla_Temporal, por cada SPID que ejecute en el momento dicho proceso, se creara una tabla con el mismo nombre, solo que le añade el SPID.
Perdoname si me exprese mal, no creo una tabla temporal de sql server con ##mitabla, sino que es una tabla común pero que la uso de temporal yo.
  #10 (permalink)  
Antiguo 30/09/2010, 22:48
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Loqueos datos select (SQL 2008)

Bueno, entonces hablamos de conceptos totalmente opuestos, regresemos a la solucion propuesta, ¿que te parece?
__________________
MCTS Isaias Islas
  #11 (permalink)  
Antiguo 01/10/2010, 04:20
Avatar de gustavoh10  
Fecha de Ingreso: diciembre-2005
Ubicación: ARGENTINA
Mensajes: 196
Antigüedad: 18 años, 4 meses
Puntos: 3
Respuesta: Loqueos datos select (SQL 2008)

Creo que te referís a la solución propuesta en el segundo post. Si bien no la descarto, voy a seguir buscando la forma de hacerlo automáticamente (si es posible). Tengo que hacerme un tiempo para repasar las formas de bloqueo de sql server 2008 y los table hints que incorporo.

Muchas gracias!
  #12 (permalink)  
Antiguo 01/10/2010, 19:39
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Loqueos datos select (SQL 2008)

Gustavo

Con todo el respeto que me mereces, NO PUEDES BLOQUEAR registros mediante un SELECT para que nadie te los toque, realizar acciones y despues de todo eso, desbloquear dichos registros y MENOS de forma AUTOMATICA.

Si lo logras, pues nos pasas el tip.

Saludos
__________________
MCTS Isaias Islas
  #13 (permalink)  
Antiguo 04/10/2010, 04:25
Avatar de gustavoh10  
Fecha de Ingreso: diciembre-2005
Ubicación: ARGENTINA
Mensajes: 196
Antigüedad: 18 años, 4 meses
Puntos: 3
Respuesta: Loqueos datos select (SQL 2008)

Cita:
Iniciado por iislas Ver Mensaje
Gustavo

Con todo el respeto que me mereces, NO PUEDES BLOQUEAR registros mediante un SELECT para que nadie te los toque, realizar acciones y despues de todo eso, desbloquear dichos registros y MENOS de forma AUTOMATICA.

Si lo logras, pues nos pasas el tip.

Saludos
Yo creo que si se puede usando los table hints de sql server (posiblemente este confundido, pero creo que se debería poder)

LINK

Podes mirar el hint xlock

Cita:

XLOCK
Specifies that exclusive locks are to be taken and held until the transaction completes. If specified with ROWLOCK, PAGLOCK, or TABLOCK, the exclusive locks apply to the appropriate level of granularity.
Solo que estoy buscando como hacerlo funcionar en mi escenario.

Saludso!
  #14 (permalink)  
Antiguo 04/10/2010, 11:07
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Loqueos datos select (SQL 2008)

Bueno, pues como lo mencione, "si lo logras, nos pasas el tip", sobre todo para hacer pruebas.
__________________
MCTS Isaias Islas
  #15 (permalink)  
Antiguo 04/10/2010, 12:51
Avatar de gustavoh10  
Fecha de Ingreso: diciembre-2005
Ubicación: ARGENTINA
Mensajes: 196
Antigüedad: 18 años, 4 meses
Puntos: 3
Respuesta: Loqueos datos select (SQL 2008)

Cita:
Iniciado por iislas Ver Mensaje
Bueno, pues como lo mencione, "si lo logras, nos pasas el tip", sobre todo para hacer pruebas.
Si amigo, no hay problema.!!

Por ejemplo tenes el hint tablockx que te hace un bloqueo de toda la tabla de forma exclusiva hasta que termina la transacción.

Así como ese y xlock hay varios.

Saludos!
  #16 (permalink)  
Antiguo 04/10/2010, 13:16
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Loqueos datos select (SQL 2008)

Y crees que sea conveniente BLOQUEAR TODA LA TABLA, hasta en tanto se cumpla tu transaccion, desde mi punto de vista, no lo veo operable.
__________________
MCTS Isaias Islas
  #17 (permalink)  
Antiguo 04/10/2010, 15:14
Avatar de gustavoh10  
Fecha de Ingreso: diciembre-2005
Ubicación: ARGENTINA
Mensajes: 196
Antigüedad: 18 años, 4 meses
Puntos: 3
Respuesta: Loqueos datos select (SQL 2008)

Cita:
Iniciado por iislas Ver Mensaje
Y crees que sea conveniente BLOQUEAR TODA LA TABLA, hasta en tanto se cumpla tu transaccion, desde mi punto de vista, no lo veo operable.
No, como vos decís eso no es conveniente, solo mencione uno que probé, todavía no llego a la solución que quiero.
Si bien el resultado final es el que quiero con tablockx voy a tener a otros usuarios esperando hasta que termine la transacción.

Si encuentro una forma limpia y eficiente para hacerlo, las posteo.
Gracias por tu atención!

Etiquetas: select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:40.