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

#1 Maxi
11/10/2005 - 18:27 | Informe spam
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
#2 Alejandro Mesa
11/10/2005 - 18:56 | Informe spam
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
#3 Yoli
11/10/2005 - 19:01 | Informe spam
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
#4 Yoli
11/10/2005 - 19:05 | Informe spam
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
#5 Maxi
11/10/2005 - 19:12 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida