Discussion:
Transacciones...
(demasiado antiguo para responder)
SpDFox
2005-01-12 15:06:26 UTC
Permalink
Tengo una duda ... cuando inicio una transacción con Begin Trans la tabla
vinculada a la trasacción se bloquea totalmente ??

Saludos.

SPdFox

--
qwalgrande
2005-01-12 15:25:02 UTC
Permalink
Hola.

El "begin transaction" en sí no bloquea nada. Si luego realizas operaciones
antes de realizar el "commit transaction" sí puedes llegar a bloquear la
tabla o tablas, a nivel de registro de página o de tabla incluso. Si por
ejemplo en tu transacción realizas:
begin trans
update tabla set campo1 = 'nuevo valor' where ClavePrimaria = 7500

Hasta que no hagas "commit trans", una select que incluya este registro se
quedaría bloqueada (siempre y cuando en la select no se reduzca el nivel de
aislamiento).

Échale un ojo a los BOL para tener una idea de cómo funciona.

qwalgrande
Post by SpDFox
Tengo una duda ... cuando inicio una transacción con Begin Trans la tabla
vinculada a la trasacción se bloquea totalmente ??
Saludos.
SPdFox
--
Salvador Ramos
2005-01-12 15:30:19 UTC
Permalink
Por supuesto que no, si no imagínate la poca escalabilidad que tendría SQL
Server ;-)

Los datos (o filas) que se bloquea no o no, depende mucho de qué instrucción
estés ejecutando, los registros a los que afecte la transacción etc..
Si quieres aplicarlo a algun caso concreto, indicanos qué estás haciendo
exactamente, e intentaremos explicarte en tu caso concreto qué se está
bloqueando.
--
Un saludo
Salvador Ramos
Murcia - España
-----------------------------------------------
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)
-----------------------------------------------
Post by SpDFox
Tengo una duda ... cuando inicio una transacción con Begin Trans la tabla
vinculada a la trasacción se bloquea totalmente ??
Saludos.
SPdFox
--
SpDFox
2005-01-12 16:48:16 UTC
Permalink
Les explico .....

Desde el analizador de consultas ejecuto lo siguiente

BEGIN TRANSACTION
Update Tabla Set Codigo = '001' where idAnim = '2526'

Y luego abro otra ventana del analizador de consultas y ejecuto lo siguiente

Select * from Tabla Where codigo = '003'

Pero no me devuelve nada hasta que yo finalize la transacción en la ventana
anterior del analizador de consultas

Saludos

SPDFOX
--
Post by Salvador Ramos
Por supuesto que no, si no imagínate la poca escalabilidad que tendría SQL
Server ;-)
Los datos (o filas) que se bloquea no o no, depende mucho de qué instrucción
estés ejecutando, los registros a los que afecte la transacción etc..
Si quieres aplicarlo a algun caso concreto, indicanos qué estás haciendo
exactamente, e intentaremos explicarte en tu caso concreto qué se está
bloqueando.
--
Un saludo
Salvador Ramos
Murcia - España
-----------------------------------------------
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)
-----------------------------------------------
Post by SpDFox
Tengo una duda ... cuando inicio una transacción con Begin Trans la tabla
vinculada a la trasacción se bloquea totalmente ??
Saludos.
SPdFox
--
Gustavo Larriera [MVP]
2005-01-12 17:28:38 UTC
Permalink
Posiblemente tengas un bloqueo, pero eso depende de tus datos. Fijate
por ejemplo, en este caso todo funciona ok.

1. En una sesion abierta ejecuto:

USE northwind
GO

BEGIN TRAN
UPDATE orders
SET shipcity = 'Montevideo'
WHERE orderid = '10248'

2. En otra sesión ejecuto:

USE northwind
GO

SELECT *
FROM orders
WHERE orderid <> '10248'

En la Sesion 2 no tengo bloqueos extras a pesar de que sigue abierta la
transacción 1, se muestran todos los registros. Solamente si en la
transacción 2 hago:

SELECT *
FROM orders
WHERE orderid = '10248'

En este caso _sí_ obtengo un bloqueo hasta que cierre la transacción 1.
Post by SpDFox
Les explico .....
Desde el analizador de consultas ejecuto lo siguiente
BEGIN TRANSACTION
Update Tabla Set Codigo = '001' where idAnim = '2526'
Y luego abro otra ventana del analizador de consultas y ejecuto lo siguiente
Select * from Tabla Where codigo = '003'
Pero no me devuelve nada hasta que yo finalize la transacción en la ventana
anterior del analizador de consultas
Saludos
SPDFOX
--
Post by Salvador Ramos
Por supuesto que no, si no imagínate la poca escalabilidad que tendría SQL
Server ;-)
Los datos (o filas) que se bloquea no o no, depende mucho de qué
instrucción
Post by Salvador Ramos
estés ejecutando, los registros a los que afecte la transacción etc..
Si quieres aplicarlo a algun caso concreto, indicanos qué estás haciendo
exactamente, e intentaremos explicarte en tu caso concreto qué se está
bloqueando.
--
Un saludo
Salvador Ramos
Murcia - España
-----------------------------------------------
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)
-----------------------------------------------
Post by SpDFox
Tengo una duda ... cuando inicio una transacción con Begin Trans la
tabla
Post by Salvador Ramos
Post by SpDFox
vinculada a la trasacción se bloquea totalmente ??
Saludos.
SPdFox
--
--
Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
--
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and
confers no rights.
--
SpDFox
2005-01-12 19:28:27 UTC
Permalink
Gracias Gustavo ... el ejemplo esta OK ..... lo acabo de probar y funciona
bien ... pero porque en mi caso no funciona ??? .... que debo tener en
cuentra para los bloqueos en las transacciones...

SPDFOX
--
Post by Gustavo Larriera [MVP]
Posiblemente tengas un bloqueo, pero eso depende de tus datos. Fijate
por ejemplo, en este caso todo funciona ok.
USE northwind
GO
BEGIN TRAN
UPDATE orders
SET shipcity = 'Montevideo'
WHERE orderid = '10248'
USE northwind
GO
SELECT *
FROM orders
WHERE orderid <> '10248'
En la Sesion 2 no tengo bloqueos extras a pesar de que sigue abierta la
transacción 1, se muestran todos los registros. Solamente si en la
SELECT *
FROM orders
WHERE orderid = '10248'
En este caso _sí_ obtengo un bloqueo hasta que cierre la transacción 1.
Post by SpDFox
Les explico .....
Desde el analizador de consultas ejecuto lo siguiente
BEGIN TRANSACTION
Update Tabla Set Codigo = '001' where idAnim = '2526'
Y luego abro otra ventana del analizador de consultas y ejecuto lo siguiente
Select * from Tabla Where codigo = '003'
Pero no me devuelve nada hasta que yo finalize la transacción en la ventana
anterior del analizador de consultas
Saludos
SPDFOX
--
Post by Salvador Ramos
Por supuesto que no, si no imagínate la poca escalabilidad que tendría SQL
Server ;-)
Los datos (o filas) que se bloquea no o no, depende mucho de qué
instrucción
Post by Salvador Ramos
estés ejecutando, los registros a los que afecte la transacción etc..
Si quieres aplicarlo a algun caso concreto, indicanos qué estás haciendo
exactamente, e intentaremos explicarte en tu caso concreto qué se está
bloqueando.
--
Un saludo
Salvador Ramos
Murcia - España
-----------------------------------------------
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)
-----------------------------------------------
Post by SpDFox
Tengo una duda ... cuando inicio una transacción con Begin Trans la
tabla
Post by Salvador Ramos
Post by SpDFox
vinculada a la trasacción se bloquea totalmente ??
Saludos.
SPdFox
--
--
Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
--
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and
confers no rights.
--
Gustavo Larriera [MVP]
2005-01-12 19:47:59 UTC
Permalink
Como te decía Salvador, SQL Server tiene un mecanismo de bloqueo donde
en base a los recursos disponibles y a la cantidad de objetos a
bloquear, decide si debe bloquear un registro solamente, o una página o
incluso una tabla completa.

Posiblemente en tu caso, el bloqueo a escalado a más de un registro y
por eso hay otros registros bloqueados además del que está siendo
modificado por tu UPDATE.

Una forma de tener más control sobre ese comportamiento es usando
"locking hints" en tus sentencias SQL y/o usando SET TRANSACTION
ISOLATION LEVEL. Los detalles de esto los tienes en los Books Online
(BOL).

De todas formas, estás en un comportamiento normal: Mientras está
abierta la transacción de UPDATE de un registro, no se le puede acceder
desde otra transacción para garantizar consistencia de datos.

Saludos
gux
Post by SpDFox
Gracias Gustavo ... el ejemplo esta OK ..... lo acabo de probar y funciona
bien ... pero porque en mi caso no funciona ??? .... que debo tener en
cuentra para los bloqueos en las transacciones...
SPDFOX
--
Post by Gustavo Larriera [MVP]
Posiblemente tengas un bloqueo, pero eso depende de tus datos. Fijate
por ejemplo, en este caso todo funciona ok.
USE northwind
GO
BEGIN TRAN
UPDATE orders
SET shipcity = 'Montevideo'
WHERE orderid = '10248'
USE northwind
GO
SELECT *
FROM orders
WHERE orderid <> '10248'
En la Sesion 2 no tengo bloqueos extras a pesar de que sigue abierta la
transacción 1, se muestran todos los registros. Solamente si en la
SELECT *
FROM orders
WHERE orderid = '10248'
En este caso _sí_ obtengo un bloqueo hasta que cierre la transacción 1.
Post by SpDFox
Les explico .....
Desde el analizador de consultas ejecuto lo siguiente
BEGIN TRANSACTION
Update Tabla Set Codigo = '001' where idAnim = '2526'
Y luego abro otra ventana del analizador de consultas y ejecuto lo siguiente
Select * from Tabla Where codigo = '003'
Pero no me devuelve nada hasta que yo finalize la transacción en la ventana
anterior del analizador de consultas
Saludos
SPDFOX
--
Post by Salvador Ramos
Por supuesto que no, si no imagínate la poca escalabilidad que
tendría
SQL
Server ;-)
Los datos (o filas) que se bloquea no o no, depende mucho de qué
instrucción
Post by Salvador Ramos
estés ejecutando, los registros a los que afecte la transacción etc..
Si quieres aplicarlo a algun caso concreto, indicanos qué estás haciendo
exactamente, e intentaremos explicarte en tu caso concreto qué se está
bloqueando.
--
Un saludo
Salvador Ramos
Murcia - España
-----------------------------------------------
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)
-----------------------------------------------
Post by SpDFox
Tengo una duda ... cuando inicio una transacción con Begin Trans la
tabla
Post by Salvador Ramos
Post by SpDFox
vinculada a la trasacción se bloquea totalmente ??
Saludos.
SPdFox
--
--
Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
--
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and
confers no rights.
--
SpDFox
2005-01-12 20:08:52 UTC
Permalink
Esta mañana estaba haciendo las pruebas usando los locking hints .... y
usando "Set Transaction Isolation Level Read Committed" .. me sucede lo
mismo, se me bloquea la tabla completa. pero al cambiar a "Set Transaction
Isolation Level Read unCommitted" .. el problema es que veo las
modificaciones en los datos que la otra instantacia ha realizado.

Mi pregunta es porque en el ejemplo que me enviaste funciona bien y en el
que yo hago no .... practicamente tiene la misma estructura de la tabla.

Gracias por todo Gustavo..

Saludos

SPDFOX
--
Post by Gustavo Larriera [MVP]
Como te decía Salvador, SQL Server tiene un mecanismo de bloqueo donde
en base a los recursos disponibles y a la cantidad de objetos a
bloquear, decide si debe bloquear un registro solamente, o una página o
incluso una tabla completa.
Posiblemente en tu caso, el bloqueo a escalado a más de un registro y
por eso hay otros registros bloqueados además del que está siendo
modificado por tu UPDATE.
Una forma de tener más control sobre ese comportamiento es usando
"locking hints" en tus sentencias SQL y/o usando SET TRANSACTION
ISOLATION LEVEL. Los detalles de esto los tienes en los Books Online
(BOL).
De todas formas, estás en un comportamiento normal: Mientras está
abierta la transacción de UPDATE de un registro, no se le puede acceder
desde otra transacción para garantizar consistencia de datos.
Saludos
gux
Post by SpDFox
Gracias Gustavo ... el ejemplo esta OK ..... lo acabo de probar y funciona
bien ... pero porque en mi caso no funciona ??? .... que debo tener en
cuentra para los bloqueos en las transacciones...
SPDFOX
--
Post by Gustavo Larriera [MVP]
Posiblemente tengas un bloqueo, pero eso depende de tus datos. Fijate
por ejemplo, en este caso todo funciona ok.
USE northwind
GO
BEGIN TRAN
UPDATE orders
SET shipcity = 'Montevideo'
WHERE orderid = '10248'
USE northwind
GO
SELECT *
FROM orders
WHERE orderid <> '10248'
En la Sesion 2 no tengo bloqueos extras a pesar de que sigue abierta la
transacción 1, se muestran todos los registros. Solamente si en la
SELECT *
FROM orders
WHERE orderid = '10248'
En este caso _sí_ obtengo un bloqueo hasta que cierre la transacción 1.
Post by SpDFox
Les explico .....
Desde el analizador de consultas ejecuto lo siguiente
BEGIN TRANSACTION
Update Tabla Set Codigo = '001' where idAnim = '2526'
Y luego abro otra ventana del analizador de consultas y ejecuto lo siguiente
Select * from Tabla Where codigo = '003'
Pero no me devuelve nada hasta que yo finalize la transacción en la ventana
anterior del analizador de consultas
Saludos
SPDFOX
--
Post by Salvador Ramos
Por supuesto que no, si no imagínate la poca escalabilidad que
tendría
SQL
Server ;-)
Los datos (o filas) que se bloquea no o no, depende mucho de qué
instrucción
Post by Salvador Ramos
estés ejecutando, los registros a los que afecte la transacción etc..
Si quieres aplicarlo a algun caso concreto, indicanos qué estás haciendo
exactamente, e intentaremos explicarte en tu caso concreto qué se está
bloqueando.
--
Un saludo
Salvador Ramos
Murcia - España
-----------------------------------------------
[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL server, Windows DNA y .NET)
-----------------------------------------------
Post by SpDFox
Tengo una duda ... cuando inicio una transacción con Begin Trans la
tabla
Post by Salvador Ramos
Post by SpDFox
vinculada a la trasacción se bloquea totalmente ??
Saludos.
SPdFox
--
--
Gustavo Larriera, MVP
Uruguay LatAm
http://sqljunkies.com/weblog/gux/
--
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and
confers no rights.
--
e***@esatclear.ie
2005-01-13 13:49:07 UTC
Permalink
Hola,

Por curiosidad, prueba a ejecutar el siguiente script
Update Tabla Set Codigo = '001' where idAnim = '2526'

Y luego abro otra ventana del analizador de consultas y ejecuto lo
siguiente

Select * from Tabla Where codigo = '003'

Añade el siguiente script al de Gustavo;

-- Crea una tabla temp para almacenar salida de sp_lock

Create table #tmp(
spid smallint,
dbid smallint,
ObjId int,
IndId smallint,
Type nchar(4),
Resource nchar(16),
Mode nvarchar(8),
Status nvarchar(10))

GO

truncate table #tmp
insert #tmp
exec sp_lock
GO

USE NorthWind
GO
select * from #tmp where dbid = db_id('Northwind') and Objid =
object_id('orders')
GO

Cambia el script de Gustavo con la siguiente opcion:

BEGIN TRAN
UPDATE orders WITH (ROWLOCK) ...

ejecuta el script de arriba, a mi me da:
51 6 21575115 1 PAG 1:205 IX GRANT
51 6 21575115 0 TAB IX GRANT
51 6 21575115 1 KEY (0800541f512d) X GRANT

Observa que el exclusive (X) lock se establece al nivel de key en mi
servidor. SQL crea un lock "potencial" para la tabla, luego para la
pagina y posteriormente bloque el registro.

Prueba a cambiar la opcion con TABLOCK y PAGLOCK y observa como SQL
cambia la estrategia de bloqueos.

Saludos.

Loading...