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:
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 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]
Cita:
, la forma en que realizo el bloque por filas es la siguiente:a b
1 1
2 2
3 3
1 1
2 2
3 3
Código:
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 .SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran select * from TPrueba with(Rowlock,Xlock) where a >= 1 and a<=2 commit
Si yo ejecuto este codigo ( Transaccion 2 ) en otra ventana del analizador de consultas :
Código:
Se ejecuta sin problema , por que los registros que estan bloqueados son los que tienen la clave 1 y 2 .SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran select * from TPrueba with(Rowlock,Xlock) where a =3 commit
En cambio si yo ejecuto este codigo ( Transaccion 3 ) :
Código:
Se queda pasmado , hasta que el codigo de la Transaccion 1 no termine con el commit o el rollBack..SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran select * from TPrueba with(Rowlock,Xlock) where a =1 commit
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:
Y efectivamente no esta bloqueado , me lo muestra , pero que pasa si hago la siguiente consulta :SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran select * from TPrueba with(Rowlock,Xlock) where a =3 commit
Código:
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 :SET TRANSACTION ISOLATION LEVEL READ COMMITTED begin tran select * from TPrueba with(Rowlock,Xlock) where b =3 commit
Hay alguna forma de resolver este problema ....