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
, 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 ....