Update y bloqueos

02/11/2006 - 18:31 por xtian | Informe spam
Hola a todos, tengo una duda de conceptos, miren cuando hago un query
tan simple como este:
update tabla
set tab_cod = '0001'
where year(tab_fch) = 2002

Que es lo que sucede internamente, se hace un bloqueo completo de la
tabla? lo digo porque tengo una tabla parecida a esta y estoy seguro
que nadie manipula datos tan antiguos del año 2002, sin embargo cuando
corro el update bloqueo a muchos usuarios que supuestamente estan
operando con datos actuales de la tabla y eso no es lo que busco,
supuestamente deberia bloquear solo a aquellos que estan trabajando
data del año 2002, estoy en lo correcto? o hay algo que se me esta
pasando?

Gracias ...

Preguntas similare

Leer las respuestas

#1 Maxi
02/11/2006 - 19:03 | Informe spam
Hola, depende, SQL no bloquea por registros sino por paginas y hay ocaciones
donde si son muchas las paginas podria hacer un bloqueo general de la tabla
Ademas en este query estas teniendo un problema importante que es el uso de
funciones en el Where "where year(tab_fch) = 2002"
esto hara que si hay un indice para esa columna no sea usado de forma
eficiente con lo cual la query tardara mas y esto se traduce en mas tiempo
de bloqueo.
Yo te recomiendo que cambies primero esa instruccion en el where por algo
asi como

where tab_fch >= '20020101' and tab_fch <'20030101'




Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"xtian" escribió en el mensaje
news:
Hola a todos, tengo una duda de conceptos, miren cuando hago un query
tan simple como este:
update tabla
set tab_cod = '0001'
where year(tab_fch) = 2002

Que es lo que sucede internamente, se hace un bloqueo completo de la
tabla? lo digo porque tengo una tabla parecida a esta y estoy seguro
que nadie manipula datos tan antiguos del año 2002, sin embargo cuando
corro el update bloqueo a muchos usuarios que supuestamente estan
operando con datos actuales de la tabla y eso no es lo que busco,
supuestamente deberia bloquear solo a aquellos que estan trabajando
data del año 2002, estoy en lo correcto? o hay algo que se me esta
pasando?

Gracias ...
Respuesta Responder a este mensaje
#2 Javier Loria
02/11/2006 - 19:10 | Informe spam
Hola:
Depende del numero de datos del 2002 y del total de la tabla. Lo mas
probable es que bloquee toda la tabla. Rsto es porque SQL tiene un concepto
llamado bloqueos escalables, o sea cuando tiene que bloquear unas cuantas
filas, lo mas probable es que sea mas eficiente bloquear la pagina, si
bloquea muchas paginas es muy probable que sea mas eficiente bloquear la
tabla. Esto tambien en valido para los indices, o sea si esta columna
participa en un indice, algunas paginas o el indice completo puede ser
bloqueado.
En algunas ocasiones es necesario hacer las sentencias en bloques
(añadiendo una condicion adicional) para hacerlo N veces. :(
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"xtian" wrote in message
news:
Hola a todos, tengo una duda de conceptos, miren cuando hago un query
tan simple como este:
update tabla
set tab_cod = '0001'
where year(tab_fch) = 2002

Que es lo que sucede internamente, se hace un bloqueo completo de la
tabla? lo digo porque tengo una tabla parecida a esta y estoy seguro
que nadie manipula datos tan antiguos del año 2002, sin embargo cuando
corro el update bloqueo a muchos usuarios que supuestamente estan
operando con datos actuales de la tabla y eso no es lo que busco,
supuestamente deberia bloquear solo a aquellos que estan trabajando
data del año 2002, estoy en lo correcto? o hay algo que se me esta
pasando?

Gracias ...
Respuesta Responder a este mensaje
#3 Javier Loria
02/11/2006 - 19:15 | Informe spam
Hola:
Person se me fue demasiado rapido.
Tambien puedes poner un hint, algo como WITH (ROWLOCK)
Esto deberia hacer el borrado mas lento, pero sin bloquear la tabla.
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"Javier Loria" wrote in message
news:Ol2EApq$
Hola:
Depende del numero de datos del 2002 y del total de la tabla. Lo mas
probable es que bloquee toda la tabla. Rsto es porque SQL tiene un
concepto llamado bloqueos escalables, o sea cuando tiene que bloquear unas
cuantas filas, lo mas probable es que sea mas eficiente bloquear la
pagina, si bloquea muchas paginas es muy probable que sea mas eficiente
bloquear la tabla. Esto tambien en valido para los indices, o sea si esta
columna participa en un indice, algunas paginas o el indice completo puede
ser bloqueado.
En algunas ocasiones es necesario hacer las sentencias en bloques
(añadiendo una condicion adicional) para hacerlo N veces. :(
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"xtian" wrote in message
news:
Hola a todos, tengo una duda de conceptos, miren cuando hago un query
tan simple como este:
update tabla
set tab_cod = '0001'
where year(tab_fch) = 2002

Que es lo que sucede internamente, se hace un bloqueo completo de la
tabla? lo digo porque tengo una tabla parecida a esta y estoy seguro
que nadie manipula datos tan antiguos del año 2002, sin embargo cuando
corro el update bloqueo a muchos usuarios que supuestamente estan
operando con datos actuales de la tabla y eso no es lo que busco,
supuestamente deberia bloquear solo a aquellos que estan trabajando
data del año 2002, estoy en lo correcto? o hay algo que se me esta
pasando?

Gracias ...


Respuesta Responder a este mensaje
#4 Javier Loria
02/11/2006 - 19:37 | Informe spam
Hola Maxi:
Disculpa la correcion: "SQL no bloquea por registros sino por paginas"
no es cierto.
Revisa este codigo en el Query Analizer o en Management Studio:
CREATE DATABASE Prueba
GO
USE Prueba
GO
CREATE TABLE Demo(
Col1 INT NOT NULL PRIMARY KEY
, Blanco CHAR(100) NOT NULL
)
GO
INSERT Demo(Col1, Blanco)
SELECT 1, 'DEMO1'
UNION ALL
SELECT 2, 'DEMO2'
GO
BEGIN TRAN
UPDATE Demo
SET Blanco='Nueva Demo1'
WHERE Col1=1
En otra ventana escribe:
USE Prueba
GO
BEGIN TRAN
UPDATE Demo
SET Blanco='Nueva Demo2'
WHERE Col1=2

Verás como la primera no bloquea la segunda.
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning
"Maxi" wrote in message
news:uZk5hlq$
Hola, depende, SQL no bloquea por registros sino por paginas y hay
ocaciones donde si son muchas las paginas podria hacer un bloqueo general
de la tabla
Ademas en este query estas teniendo un problema importante que es el uso
de funciones en el Where "where year(tab_fch) = 2002"
esto hara que si hay un indice para esa columna no sea usado de forma
eficiente con lo cual la query tardara mas y esto se traduce en mas tiempo
de bloqueo.
Yo te recomiendo que cambies primero esa instruccion en el where por algo
asi como

where tab_fch >= '20020101' and tab_fch <'20030101'




Salu2

Microsoft MVP SQL Server
Culminis Speaker
INETA Speaker

"xtian" escribió en el mensaje
news:
Hola a todos, tengo una duda de conceptos, miren cuando hago un query
tan simple como este:
update tabla
set tab_cod = '0001'
where year(tab_fch) = 2002

Que es lo que sucede internamente, se hace un bloqueo completo de la
tabla? lo digo porque tengo una tabla parecida a esta y estoy seguro
que nadie manipula datos tan antiguos del año 2002, sin embargo cuando
corro el update bloqueo a muchos usuarios que supuestamente estan
operando con datos actuales de la tabla y eso no es lo que busco,
supuestamente deberia bloquear solo a aquellos que estan trabajando
data del año 2002, estoy en lo correcto? o hay algo que se me esta
pasando?

Gracias ...


Respuesta Responder a este mensaje
#5 xtian
02/11/2006 - 19:51 | Informe spam
Pues muchas gracias a ambos por despejarme las dudas, pense en un
momento que era un error de configuración, pero si es asi como
funciona el SQL Server, pues ni vuelta que darle.

Muchas gracias


Javier Loria ha escrito:

Hola Maxi:
Disculpa la correcion: "SQL no bloquea por registros sino por paginas"
no es cierto.
Revisa este codigo en el Query Analizer o en Management Studio:
> CREATE DATABASE Prueba
GO
USE Prueba
GO
CREATE TABLE Demo(
Col1 INT NOT NULL PRIMARY KEY
, Blanco CHAR(100) NOT NULL
)
GO
INSERT Demo(Col1, Blanco)
SELECT 1, 'DEMO1'
UNION ALL
SELECT 2, 'DEMO2'
GO
BEGIN TRAN
UPDATE Demo
SET Blanco='Nueva Demo1'
WHERE Col1=1
> En otra ventana escribe:
> USE Prueba
GO
BEGIN TRAN
UPDATE Demo
SET Blanco='Nueva Demo2'
WHERE Col1=2

> Verás como la primera no bloquea la segunda.
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning
"Maxi" wrote in message
news:uZk5hlq$
> Hola, depende, SQL no bloquea por registros sino por paginas y hay
> ocaciones donde si son muchas las paginas podria hacer un bloqueo general
> de la tabla
> Ademas en este query estas teniendo un problema importante que es el uso
> de funciones en el Where "where year(tab_fch) = 2002"
> esto hara que si hay un indice para esa columna no sea usado de forma
> eficiente con lo cual la query tardara mas y esto se traduce en mas tiempo
> de bloqueo.
> Yo te recomiendo que cambies primero esa instruccion en el where por algo
> asi como
>
> where tab_fch >= '20020101' and tab_fch <'20030101'
>
>
>
>
> Salu2
>
> Microsoft MVP SQL Server
> Culminis Speaker
> INETA Speaker
>
> "xtian" escribió en el mensaje
> news:
> Hola a todos, tengo una duda de conceptos, miren cuando hago un query
> tan simple como este:
> update tabla
> set tab_cod = '0001'
> where year(tab_fch) = 2002
>
> Que es lo que sucede internamente, se hace un bloqueo completo de la
> tabla? lo digo porque tengo una tabla parecida a esta y estoy seguro
> que nadie manipula datos tan antiguos del año 2002, sin embargo cuando
> corro el update bloqueo a muchos usuarios que supuestamente estan
> operando con datos actuales de la tabla y eso no es lo que busco,
> supuestamente deberia bloquear solo a aquellos que estan trabajando
> data del año 2002, estoy en lo correcto? o hay algo que se me esta
> pasando?
>
> Gracias ...
>
>
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida