Evitar deadlocks

11/10/2005 - 18:08 por Yoli | Informe spam
Hola,

¿Cómo puedo evitar que se produzca un deadlock en sql server al intentar
utilizar datos de una misma tabla?

Tengo que obtener el número máximo que contiene un campo, a este campo hay
que acceder de forma concurrente, y sólo lo puede leer un proceso cada vez,
una vez que lo lea ha de actualizar un campo.

¿Hay algún mecanismo para implementar algún tipo de zona de exclusión mutua
para que no bloquee a otros procesos? Necesito hacer que la transacción que
se ejecute concurrentemente bloquee esta tabla solamente en una parte
determinada, no en toda la transacción.

Saludos y gracias!!!

Preguntas similare

Leer las respuestas

#6 Maxi
11/10/2005 - 19:16 | Informe spam
peron me re equivoque

http://www.microsoft.com/spanish/ms...art187.asp

;-)


Salu2
Maxi [MVP SQL SERVER]


"Maxi" escribió en el mensaje
news:
Hola, si quieres hacer eso te recomiendo este articulo:

http://www.configuracionesintegrale...ulo"6

http://www.helpdna.net/bosqlfaq01.htm


Salu2
Maxi [MVP SQL SERVER]


"Yoli" escribió en el mensaje
news:%23xkT$
Hola,

Es un campo que utilizo para asignar un número a un ticket.

Lo que quiero es obtener el número máximo de ese ticket, incrementarlo en
uno, asignárselo al nuevo ticket, y cuando esté hecho eso que el resto de
procesos puedan utilizar esta tabla.

Saludos y gracias!!

"Maxi" escribió en el mensaje
news:
Hola, a ver: yo prefiero que me cuentes otra cosa: para que necesitas
ese valor maximo de un campo? y que haces con el


Salu2
Maxi [MVP SQL SERVER]


"Yoli" escribió en el mensaje
news:
Hola,

¿Cómo puedo evitar que se produzca un deadlock en sql server al
intentar utilizar datos de una misma tabla?

Tengo que obtener el número máximo que contiene un campo, a este campo
hay que acceder de forma concurrente, y sólo lo puede leer un proceso
cada vez, una vez que lo lea ha de actualizar un campo.

¿Hay algún mecanismo para implementar algún tipo de zona de exclusión
mutua para que no bloquee a otros procesos? Necesito hacer que la
transacción que se ejecute concurrentemente bloquee esta tabla
solamente en una parte determinada, no en toda la transacción.

Saludos y gracias!!!













Respuesta Responder a este mensaje
#7 Alejandro Mesa
11/10/2005 - 20:10 | Informe spam
Yoli,

Creastes alguna traza con SQL Profiler para monitorear este evento?, si no
lo has hecho, entonces te aconsejo lo hagas, no solamente veras los procesos
involucrados, sino que veras tambien las sentencias.


AMB

"Yoli" wrote:

La transacción es corta, no tiene interacción con los usuarios, todos los
recursos se utilizan en el mismo orden, y calculo los datos necesarios antes
de entrar en la transacción para no tener que calcularlos dentro de la
transacción.

Lo que me lanza mi Analizador de SQL Server es un evento Lock: Deadlock
Chain.

De todos modos gracias por tu ayuda!!!!

"Alejandro Mesa" escribió en el
mensaje news:
> Yoli,
>
> Una recomendacion es usar los recursos en el mismo orden y tratar que la
> trasaccion sea lo mas corta posible. No confundamos bloqueo con deadlock,
> a
> pesar de que el segundo se produce por bloqueos inversos de recursos, este
> ultimo se puede evitar siguiendo las recomendaciones anteriores.
>
> INF: Analyzing and Avoiding Deadlocks in SQL Server
> http://support.microsoft.com/defaul...-us;169960
>
> Podrias postear un ejemplo sobre:
>
>> Tengo que obtener el número máximo que contiene un campo, a este campo
>> hay
>> que acceder de forma concurrente, y sólo lo puede leer un proceso cada
>> vez,
>> una vez que lo lea ha de actualizar un campo.
>
> Hay una forma de incrementar una columna y usar ese numero como numerador.
>
> use northwind
> go
>
> create table t1(c1 int not null default (0))
> go
>
> create table t2(c1 int not null unique)
> go
>
> insert into t1 default values
> go
>
> create procedure p1
> @v1 int output
> as
> set nocount on
>
> update t1 set @v1 = c1 = c1 + 1
>
> return @@error
> go
>
> create procedure p2
> as
> set nocount on
>
> declare @i int
>
> exec p1 @i output
>
> insert into t2 values(@i)
> go
>
> exec p2
> exec p2
> go
>
> select * from t1
> select * from t2
> go
>
> drop procedure p2, p1
> go
>
> drop table t1, t2
> go
>
>
> AMB
>
>
> "Yoli" wrote:
>
>> Hola,
>>
>> ¿Cómo puedo evitar que se produzca un deadlock en sql server al intentar
>> utilizar datos de una misma tabla?
>>
>> Tengo que obtener el número máximo que contiene un campo, a este campo
>> hay
>> que acceder de forma concurrente, y sólo lo puede leer un proceso cada
>> vez,
>> una vez que lo lea ha de actualizar un campo.
>>
>> ¿Hay algún mecanismo para implementar algún tipo de zona de exclusión
>> mutua
>> para que no bloquee a otros procesos? Necesito hacer que la transacción
>> que
>> se ejecute concurrentemente bloquee esta tabla solamente en una parte
>> determinada, no en toda la transacción.
>>
>> Saludos y gracias!!!
>>
>>
>>



Respuesta Responder a este mensaje
#8 Yoli
13/10/2005 - 09:28 | Informe spam
Exactamente, con el SQL Profiler es con el que he detectado el deadlock que
se produce y los procesos que se ven involucrados en ello, así como las
tablas afectadas.

Gracias de nuevo!!!


"Alejandro Mesa" escribió en el
mensaje news:
Yoli,

Creastes alguna traza con SQL Profiler para monitorear este evento?, si no
lo has hecho, entonces te aconsejo lo hagas, no solamente veras los
procesos
involucrados, sino que veras tambien las sentencias.


AMB

"Yoli" wrote:

La transacción es corta, no tiene interacción con los usuarios, todos los
recursos se utilizan en el mismo orden, y calculo los datos necesarios
antes
de entrar en la transacción para no tener que calcularlos dentro de la
transacción.

Lo que me lanza mi Analizador de SQL Server es un evento Lock: Deadlock
Chain.

De todos modos gracias por tu ayuda!!!!

"Alejandro Mesa" escribió en el
mensaje news:
> Yoli,
>
> Una recomendacion es usar los recursos en el mismo orden y tratar que
> la
> trasaccion sea lo mas corta posible. No confundamos bloqueo con
> deadlock,
> a
> pesar de que el segundo se produce por bloqueos inversos de recursos,
> este
> ultimo se puede evitar siguiendo las recomendaciones anteriores.
>
> INF: Analyzing and Avoiding Deadlocks in SQL Server
> http://support.microsoft.com/defaul...-us;169960
>
> Podrias postear un ejemplo sobre:
>
>> Tengo que obtener el número máximo que contiene un campo, a este campo
>> hay
>> que acceder de forma concurrente, y sólo lo puede leer un proceso cada
>> vez,
>> una vez que lo lea ha de actualizar un campo.
>
> Hay una forma de incrementar una columna y usar ese numero como
> numerador.
>
> use northwind
> go
>
> create table t1(c1 int not null default (0))
> go
>
> create table t2(c1 int not null unique)
> go
>
> insert into t1 default values
> go
>
> create procedure p1
> @v1 int output
> as
> set nocount on
>
> update t1 set @v1 = c1 = c1 + 1
>
> return @@error
> go
>
> create procedure p2
> as
> set nocount on
>
> declare @i int
>
> exec p1 @i output
>
> insert into t2 values(@i)
> go
>
> exec p2
> exec p2
> go
>
> select * from t1
> select * from t2
> go
>
> drop procedure p2, p1
> go
>
> drop table t1, t2
> go
>
>
> AMB
>
>
> "Yoli" wrote:
>
>> Hola,
>>
>> ¿Cómo puedo evitar que se produzca un deadlock en sql server al
>> intentar
>> utilizar datos de una misma tabla?
>>
>> Tengo que obtener el número máximo que contiene un campo, a este campo
>> hay
>> que acceder de forma concurrente, y sólo lo puede leer un proceso cada
>> vez,
>> una vez que lo lea ha de actualizar un campo.
>>
>> ¿Hay algún mecanismo para implementar algún tipo de zona de exclusión
>> mutua
>> para que no bloquee a otros procesos? Necesito hacer que la
>> transacción
>> que
>> se ejecute concurrentemente bloquee esta tabla solamente en una parte
>> determinada, no en toda la transacción.
>>
>> Saludos y gracias!!!
>>
>>
>>



Respuesta Responder a este mensaje
#9 Yoli
13/10/2005 - 10:28 | Informe spam
Muchisísimas Gracias Maxi!!!!

Funcionó de maravilla!!!!

Saludos!!!!!!


"Maxi" escribió en el mensaje
news:
peron me re equivoque

http://www.microsoft.com/spanish/ms...art187.asp

;-)


Salu2
Maxi [MVP SQL SERVER]


"Maxi" escribió en el mensaje
news:
Hola, si quieres hacer eso te recomiendo este articulo:

http://www.configuracionesintegrale...ulo"6

http://www.helpdna.net/bosqlfaq01.htm


Salu2
Maxi [MVP SQL SERVER]


"Yoli" escribió en el mensaje
news:%23xkT$
Hola,

Es un campo que utilizo para asignar un número a un ticket.

Lo que quiero es obtener el número máximo de ese ticket, incrementarlo
en uno, asignárselo al nuevo ticket, y cuando esté hecho eso que el
resto de procesos puedan utilizar esta tabla.

Saludos y gracias!!

"Maxi" escribió en el mensaje
news:
Hola, a ver: yo prefiero que me cuentes otra cosa: para que necesitas
ese valor maximo de un campo? y que haces con el


Salu2
Maxi [MVP SQL SERVER]


"Yoli" escribió en el mensaje
news:
Hola,

¿Cómo puedo evitar que se produzca un deadlock en sql server al
intentar utilizar datos de una misma tabla?

Tengo que obtener el número máximo que contiene un campo, a este campo
hay que acceder de forma concurrente, y sólo lo puede leer un proceso
cada vez, una vez que lo lea ha de actualizar un campo.

¿Hay algún mecanismo para implementar algún tipo de zona de exclusión
mutua para que no bloquee a otros procesos? Necesito hacer que la
transacción que se ejecute concurrentemente bloquee esta tabla
solamente en una parte determinada, no en toda la transacción.

Saludos y gracias!!!

















email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida