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

Bloqueo por filas sql server 2008

Estas en el tema de Bloqueo por filas sql server 2008 en el foro de SQL Server en Foros del Web. Hola que tal : Mi duda es la siguiente , tengo una tabla que quisiera que se bloquera por filas , es decir , los ...
  #1 (permalink)  
Antiguo 23/09/2011, 11:51
 
Fecha de Ingreso: septiembre-2011
Mensajes: 4
Antigüedad: 12 años, 7 meses
Puntos: 0
Bloqueo por filas sql server 2008

Hola que tal :

Mi duda es la siguiente , tengo una tabla que quisiera que se bloquera por filas , es decir , los registros arrojados por un select dentro de una transacción quedaran bloqueados para lectura y escritura para cualquier otra transacción , la estructura de mi tabla de prueba es la siguiente :

Código:
CREATE TABLE [dbo].[TPrueba](
	[a] [int] NOT NULL,
	[b] [int] NULL,
PRIMARY KEY CLUSTERED 
(
	[a] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
como ven la estructura de la tabla es muy sencilla ya que es una tabla donde estoy haciendo pruebas, tiene un campo "a" que es llave primaria y un campo "b", en esta tabla tengo tres registros insertados

Cita:
a b
1 1
2 2
3 3
, la forma en que realizo el bloque por filas es la siguiente:


Código:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
select 
* 
from TPrueba with(Rowlock,Xlock) where a >= 1 and a<=2
commit
Con este código llamemoslo Transaccion 1 lo que hago es bloquear los registros con clave 1 y 2 , cuando lo ejecuto en el Analizador de consultas lo hago hasta antes del Commit , para que la transacción no finalice .

Si yo ejecuto este codigo ( Transaccion 2 ) en otra ventana del analizador de consultas :

Código:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
select 
* 
from TPrueba with(Rowlock,Xlock) where a =3
commit
Se ejecuta sin problema , por que los registros que estan bloqueados son los que tienen la clave 1 y 2 .
En cambio si yo ejecuto este codigo ( Transaccion 3 ) :


Código:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
select 
* 
from TPrueba with(Rowlock,Xlock) where a =1
commit
Se queda pasmado , hasta que el codigo de la Transaccion 1 no termine con el commit o el rollBack..
Hasta aquí todo va bien , es lo que necesito , bloquear ciertos registros de un Select , pero que pasa si ejecuto una vez mas la transaccion 1 , que es la que bloquea los registros 1 y 2 , obviamente antes de esto ya termine todas las transacciones haciendoles commit.

Transaccion 1


Código:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
select 
* 
from TPrueba with(Rowlock,Xlock) where a >= 1 and a<=2
commit

Compruebo que el registro 3 no esta bloqueado

Transaccion 2

Código:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
select 
* 
from TPrueba with(Rowlock,Xlock) where a =3
commit
Y efectivamente no esta bloqueado , me lo muestra , pero que pasa si hago la siguiente consulta :


Código:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
select 
* 
from TPrueba with(Rowlock,Xlock) where b =3
commit
Aquí es donde tengo problemas , la consulta se queda pasmada , se que el registro con clave 3 y con el campo "b" con valor 3 no esta bloqueado , sin embargo cuando hago la consulta directa por su clave si me lo arroja , pero cuando hago la consulta por el campo "b" no... Supongo que a la hora de realizar la consulta por el campo "a" va directo al registro y como no esta bloqueado me lo muestra , y cuando realizo la búsqueda por el campo "b" como tiene que evaluar los registros bloqueados y los no bloqueados se pasma hasta que la transacción que bloqueo esos registros termine , Mi pregunta es :
Hay alguna forma de resolver este problema ....
  #2 (permalink)  
Antiguo 23/09/2011, 12:20
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Bloqueo por filas sql server 2008

Que es lo que quieres evitar? lecturas duplicadas hasta que se realicen las transacciones??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 23/09/2011, 12:41
 
Fecha de Ingreso: septiembre-2011
Mensajes: 4
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Bloqueo por filas sql server 2008

Pues lo que quiero es poder buscar un registro que no esta bloqueado , y poder buscarlo por cualquier columna, en el ejemplo que puse cuando busco por la columna que es llave primaria "a" no hay problema , si esta bloqueado no me lo muestra hasta que la transacción no lo desbloquea , y si no esta bloqueado no hay problema me lo muestra , el problema es cuando busco ese mismo registro que no esta bloqueado con otro filtro por ejemplo buscándolo por la columna "b" que no es llave primaria , en ese momento no me lo muestra aunque en el filtro le este indicando que sea el campo que no esta bloqueado "b = 3", creo que pasa lo siguiente :
Cuando busco directamente por la clave , el gestor va directamente por el registro, si esta bloqueado no lo muestra hasta que este liberado , en cambio si busco por cualquier otra columna, como tiene que evaluar todos los registros de la tabla ( bloqueados y no bloqueados ) por eso se pasma , yo siento que la solución va mas por el lado de los indices , pero no tengo idea de como solucionar mi problema :(
  #4 (permalink)  
Antiguo 23/09/2011, 13:03
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: Bloqueo por filas sql server 2008

A lo que Libras se refiere (si no es asi, no he escrito nada), es saber el OBJETIVO que deseas alcanzar....
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 23/09/2011, 14:38
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Bloqueo por filas sql server 2008

Ya checaste esto??

http://stackoverflow.com/questions/4...rt-transaction
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 24/09/2011, 10:30
 
Fecha de Ingreso: septiembre-2011
Mensajes: 4
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Bloqueo por filas sql server 2008

Pues lo que quiero hacer es de una tabla que tiene registros bloqueados y no bloqueados , poder seleccionar solo los que no están bloqueados ... con el ejemplo que puse arriba puedo seleccionar los campos no bloqueados pero solo haciendo el select por el campo llave .... No se si me explico

Etiquetas: bloqueo, filas, registros, select, server, sql, tabla, campos
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 23:00.