Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/09/2011, 11:51
gsfernando61
 
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 ....