Concurrencia de datos

07/01/2007 - 01:31 por fac | Informe spam
Buenas foro, queria saber que consideraciones debo tener para no tener
problemas por concurrencia de usuarios, me explico, el sistema esta hecho en
vb 6 con sql server 2000 y cuando uno realiza una transaccion en el sistema,
todo funciona bien, pero si ingresan varios, el sistema acepta a 1 o 2 y a
los demas los rechaza, en las consultas uso el (nolock) y en los update
(rowlock), asi como en las vistas y en los inserts, pero hacen las pruebas y
sigue el problema, no se que mas tengo que tener en consideracion para poder
tener 0 problemas con la concurrencia.

Los procesos son complejos pero revise y en todo considero lo anteriormente
mencionado

Muchas gracias


Jesus

Preguntas similare

Leer las respuestas

#6 Jose Mariano Alvarez
08/01/2007 - 19:02 | Informe spam
No le veo sentido al HINT fastfirstrow.

El delete es elegido como victima pero no es en si el problema sino la
duracion de las transacciones.

Tu problea es complejo de resolver.

Trata de usar buenos indices y hacer las transacciones mas pequeñas..




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Tengo esta sentencia
PRINT 'AQUI1'
DELETE FROM utb_valores_dinamica_contable with (FASTFIRSTROW)
WHERE VAR_COD_TRANSACCION = @in_var_trx
And VAR_COD_USUARIO = @in_usuario
PRINT 'AQUI2'

lo proble con (ROWLOCK) CON (UPDLOCK) pero no funciona, cuando ejecuto los
script en distintas maquinas, con distintos usuarios y la misma
transaccion sale lo siguiente

Servidor: mensaje 1205, nivel 13, estado 50, procedimiento
usp_mpc_prc_CargaInicial, línea 211
Transaction (Process ID 56) was deadlocked on lock resources with another
process and has been chosen as the deadlock victim. Rerun the transaction.

la linea 211 es justamente el delete, porque en el resultado sale aqui1
pero no imprime aqui2, saben si puede ser por algun service pack que me
este faltando?.

Y como puedo saber si tengo todos los service pack del sqlserver2000

Muchas gracias.



"Jose Mariano Alvarez"
escribió en el
mensaje news:
Que no tenga indices clustered no te va a provocar esos problemas que has
comentado en tu anterior post.

En lineas generales es conveniente que tenga un indice clustered, pero no
siempre debe ser el de la PK. El beneficio del clustered es aprovechar
para acceder a los registros de forma ordenada o cuando se requiere un
numero importante de accesos. En general el compromiso es entre recorrer
todas las paginas (SCAN) de la tabla o de un indice, o accederlas
puntualmente (SEEK) para lo cual te puede ayudar el indice.





Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Buenas, muchas gracias por los conocimientos y el apoyo, mas tarde
estare colocando el archivo del profiler a ver como me pueden ayudar o
como puedo analizarlo para ver el problema, pero tengo una consulta
adicional, este sistema que estoy viendo, ya esta desarrollado casi en
su totalidad, pero veo que las tablas no tienen indices con cluster,
tienen los pk pero sin cluster, que beneficio tiene esto porque tengo
entendido que toda tabla debe tener a menos 1 indice cluster, a menos
que en caso especial no se coloque, muchas gracias de antemano por las
respuestas a esta consulta.









Respuesta Responder a este mensaje
#7 fac
10/01/2007 - 19:01 | Informe spam
Buenas, la sentencia inferior sale error, pero revisando es porque en
distintas pc se utiliza el mismo numero de cuenta, y posteriormente es
insertado o eliminado el valor, por lo que en algunas funciona y en otras pc
no, me explico una pc elimina y luego inserta el valor, y la otra cuando
elimina le sale error porque el update o el insert lo tiene bloqueado, de
que manera puedo evitar, el proceso es muy pesado, pense en agregar una
columna que diga que pc lo inserta para que no se bloquee con otra pc,
espero me entiendan sino me dicen para explicarlo mas tranquilo, jejejeje.


Delete FROM utb_valores_dinamica_contable -- with (READPAST)
WHERE VAR_NOMBRE_VARIABLE = @in_var_nro_cuenta
And (VAR_VALOR_VARIABLE = '@@ITF_MOTIVO'
OR VAR_VALOR_VARIABLE = '@@ITF_CARGO')


"Jose Mariano Alvarez"
escribió en el
mensaje news:
No le veo sentido al HINT fastfirstrow.

El delete es elegido como victima pero no es en si el problema sino la
duracion de las transacciones.

Tu problea es complejo de resolver.

Trata de usar buenos indices y hacer las transacciones mas pequeñas..




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Tengo esta sentencia
PRINT 'AQUI1'
DELETE FROM utb_valores_dinamica_contable with (FASTFIRSTROW)
WHERE VAR_COD_TRANSACCION = @in_var_trx
And VAR_COD_USUARIO = @in_usuario
PRINT 'AQUI2'

lo proble con (ROWLOCK) CON (UPDLOCK) pero no funciona, cuando ejecuto
los script en distintas maquinas, con distintos usuarios y la misma
transaccion sale lo siguiente

Servidor: mensaje 1205, nivel 13, estado 50, procedimiento
usp_mpc_prc_CargaInicial, línea 211
Transaction (Process ID 56) was deadlocked on lock resources with another
process and has been chosen as the deadlock victim. Rerun the
transaction.

la linea 211 es justamente el delete, porque en el resultado sale aqui1
pero no imprime aqui2, saben si puede ser por algun service pack que me
este faltando?.

Y como puedo saber si tengo todos los service pack del sqlserver2000

Muchas gracias.



"Jose Mariano Alvarez"
escribió en el
mensaje news:
Que no tenga indices clustered no te va a provocar esos problemas que
has comentado en tu anterior post.

En lineas generales es conveniente que tenga un indice clustered, pero
no siempre debe ser el de la PK. El beneficio del clustered es
aprovechar para acceder a los registros de forma ordenada o cuando se
requiere un numero importante de accesos. En general el compromiso es
entre recorrer todas las paginas (SCAN) de la tabla o de un indice, o
accederlas puntualmente (SEEK) para lo cual te puede ayudar el indice.





Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Buenas, muchas gracias por los conocimientos y el apoyo, mas tarde
estare colocando el archivo del profiler a ver como me pueden ayudar o
como puedo analizarlo para ver el problema, pero tengo una consulta
adicional, este sistema que estoy viendo, ya esta desarrollado casi en
su totalidad, pero veo que las tablas no tienen indices con cluster,
tienen los pk pero sin cluster, que beneficio tiene esto porque tengo
entendido que toda tabla debe tener a menos 1 indice cluster, a menos
que en caso especial no se coloque, muchas gracias de antemano por las
respuestas a esta consulta.













Respuesta Responder a este mensaje
#8 Jose Mariano Alvarez
10/01/2007 - 20:18 | Informe spam
Por lo que se me ocurre es un problema de logica.
Que haces dentro de la transaccion?

Debes evitar hacer

BEGIN TRAN
Muchas operaciones que tardan
COMMIT

Eso no es viable si hay varias terminales haciendo lo mismo.
El DELETE en si mismo no es el problema sino "la gota que rebalsa el vaso"
Si esa es la unica alternativa debes usar el nivel de aislamiento
SERIALIZABLE.

Si aun asi siguen los problemas deberias implenetar un semaforo con una
tabla.


Todo esto te va a hacer mas lento porque reduce la concurrencia.



Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:%
Buenas, la sentencia inferior sale error, pero revisando es porque en
distintas pc se utiliza el mismo numero de cuenta, y posteriormente es
insertado o eliminado el valor, por lo que en algunas funciona y en otras
pc no, me explico una pc elimina y luego inserta el valor, y la otra
cuando elimina le sale error porque el update o el insert lo tiene
bloqueado, de que manera puedo evitar, el proceso es muy pesado, pense en
agregar una columna que diga que pc lo inserta para que no se bloquee con
otra pc, espero me entiendan sino me dicen para explicarlo mas tranquilo,
jejejeje.


Delete FROM utb_valores_dinamica_contable -- with (READPAST)
WHERE VAR_NOMBRE_VARIABLE = @in_var_nro_cuenta
And (VAR_VALOR_VARIABLE = '@@ITF_MOTIVO'
OR VAR_VALOR_VARIABLE = '@@ITF_CARGO')


"Jose Mariano Alvarez"
escribió en el
mensaje news:
No le veo sentido al HINT fastfirstrow.

El delete es elegido como victima pero no es en si el problema sino la
duracion de las transacciones.

Tu problea es complejo de resolver.

Trata de usar buenos indices y hacer las transacciones mas pequeñas..




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Tengo esta sentencia
PRINT 'AQUI1'
DELETE FROM utb_valores_dinamica_contable with (FASTFIRSTROW)
WHERE VAR_COD_TRANSACCION = @in_var_trx
And VAR_COD_USUARIO = @in_usuario
PRINT 'AQUI2'

lo proble con (ROWLOCK) CON (UPDLOCK) pero no funciona, cuando ejecuto
los script en distintas maquinas, con distintos usuarios y la misma
transaccion sale lo siguiente

Servidor: mensaje 1205, nivel 13, estado 50, procedimiento
usp_mpc_prc_CargaInicial, línea 211
Transaction (Process ID 56) was deadlocked on lock resources with
another process and has been chosen as the deadlock victim. Rerun the
transaction.

la linea 211 es justamente el delete, porque en el resultado sale aqui1
pero no imprime aqui2, saben si puede ser por algun service pack que me
este faltando?.

Y como puedo saber si tengo todos los service pack del sqlserver2000

Muchas gracias.



"Jose Mariano Alvarez"
escribió en el
mensaje news:
Que no tenga indices clustered no te va a provocar esos problemas que
has comentado en tu anterior post.

En lineas generales es conveniente que tenga un indice clustered, pero
no siempre debe ser el de la PK. El beneficio del clustered es
aprovechar para acceder a los registros de forma ordenada o cuando se
requiere un numero importante de accesos. En general el compromiso es
entre recorrer todas las paginas (SCAN) de la tabla o de un indice, o
accederlas puntualmente (SEEK) para lo cual te puede ayudar el indice.





Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Buenas, muchas gracias por los conocimientos y el apoyo, mas tarde
estare colocando el archivo del profiler a ver como me pueden ayudar o
como puedo analizarlo para ver el problema, pero tengo una consulta
adicional, este sistema que estoy viendo, ya esta desarrollado casi en
su totalidad, pero veo que las tablas no tienen indices con cluster,
tienen los pk pero sin cluster, que beneficio tiene esto porque tengo
entendido que toda tabla debe tener a menos 1 indice cluster, a menos
que en caso especial no se coloque, muchas gracias de antemano por las
respuestas a esta consulta.

















Respuesta Responder a este mensaje
#9 fac
12/01/2007 - 22:48 | Informe spam
Disculpa el poco conocimiento, como podria configurar un semaforo con una
tabla, porque he realizado cambios en los procesos con nolock, with
(rowlock) y evitando el cruce con algunas tablas pero el proceso continua
dando problemas, menos pero sigue, quisiera probar la manera que me indicas,
asi el usuario tenga la certeza que esta grabando su data de manera
correcta.


Muchas gracias.


Jesus


"Jose Mariano Alvarez"
escribió en el
mensaje news:
Por lo que se me ocurre es un problema de logica.
Que haces dentro de la transaccion?

Debes evitar hacer

BEGIN TRAN
Muchas operaciones que tardan
COMMIT

Eso no es viable si hay varias terminales haciendo lo mismo.
El DELETE en si mismo no es el problema sino "la gota que rebalsa el vaso"
Si esa es la unica alternativa debes usar el nivel de aislamiento
SERIALIZABLE.

Si aun asi siguen los problemas deberias implenetar un semaforo con una
tabla.


Todo esto te va a hacer mas lento porque reduce la concurrencia.



Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:%
Buenas, la sentencia inferior sale error, pero revisando es porque en
distintas pc se utiliza el mismo numero de cuenta, y posteriormente es
insertado o eliminado el valor, por lo que en algunas funciona y en otras
pc no, me explico una pc elimina y luego inserta el valor, y la otra
cuando elimina le sale error porque el update o el insert lo tiene
bloqueado, de que manera puedo evitar, el proceso es muy pesado, pense en
agregar una columna que diga que pc lo inserta para que no se bloquee con
otra pc, espero me entiendan sino me dicen para explicarlo mas tranquilo,
jejejeje.


Delete FROM utb_valores_dinamica_contable -- with (READPAST)
WHERE VAR_NOMBRE_VARIABLE = @in_var_nro_cuenta
And (VAR_VALOR_VARIABLE = '@@ITF_MOTIVO'
OR VAR_VALOR_VARIABLE = '@@ITF_CARGO')


"Jose Mariano Alvarez"
escribió en el
mensaje news:
No le veo sentido al HINT fastfirstrow.

El delete es elegido como victima pero no es en si el problema sino la
duracion de las transacciones.

Tu problea es complejo de resolver.

Trata de usar buenos indices y hacer las transacciones mas pequeñas..




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Tengo esta sentencia
PRINT 'AQUI1'
DELETE FROM utb_valores_dinamica_contable with (FASTFIRSTROW)
WHERE VAR_COD_TRANSACCION = @in_var_trx
And VAR_COD_USUARIO = @in_usuario
PRINT 'AQUI2'

lo proble con (ROWLOCK) CON (UPDLOCK) pero no funciona, cuando ejecuto
los script en distintas maquinas, con distintos usuarios y la misma
transaccion sale lo siguiente

Servidor: mensaje 1205, nivel 13, estado 50, procedimiento
usp_mpc_prc_CargaInicial, línea 211
Transaction (Process ID 56) was deadlocked on lock resources with
another process and has been chosen as the deadlock victim. Rerun the
transaction.

la linea 211 es justamente el delete, porque en el resultado sale aqui1
pero no imprime aqui2, saben si puede ser por algun service pack que me
este faltando?.

Y como puedo saber si tengo todos los service pack del sqlserver2000

Muchas gracias.



"Jose Mariano Alvarez"
escribió en el
mensaje news:
Que no tenga indices clustered no te va a provocar esos problemas que
has comentado en tu anterior post.

En lineas generales es conveniente que tenga un indice clustered, pero
no siempre debe ser el de la PK. El beneficio del clustered es
aprovechar para acceder a los registros de forma ordenada o cuando se
requiere un numero importante de accesos. En general el compromiso es
entre recorrer todas las paginas (SCAN) de la tabla o de un indice, o
accederlas puntualmente (SEEK) para lo cual te puede ayudar el indice.





Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Buenas, muchas gracias por los conocimientos y el apoyo, mas tarde
estare colocando el archivo del profiler a ver como me pueden ayudar
o como puedo analizarlo para ver el problema, pero tengo una consulta
adicional, este sistema que estoy viendo, ya esta desarrollado casi
en su totalidad, pero veo que las tablas no tienen indices con
cluster, tienen los pk pero sin cluster, que beneficio tiene esto
porque tengo entendido que toda tabla debe tener a menos 1 indice
cluster, a menos que en caso especial no se coloque, muchas gracias
de antemano por las respuestas a esta consulta.





















Respuesta Responder a este mensaje
#10 Jose Mariano Alvarez
15/01/2007 - 12:39 | Informe spam
Si no te funciona el SET TRANSACTION ISOLATION LEVEL SERIALIZABLE la manera
de crear un pseudo semaforo es mediante una tabla con un solo registro
haciendo:

Begin trna
uppdate TablaSemaforo set Col = Col + 1 -- esta debe ser la primera
instruccion de la transaccion
<Aqui haces todo lo que precisas>

commit tran


Mientras dure la transaccion, nadie mas puede realizar un segundo update al
mismo registro creando de esta manera un pseudo semaforo ya que uno solo por
vez puede hacer el update

Suerte



Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Disculpa el poco conocimiento, como podria configurar un semaforo con una
tabla, porque he realizado cambios en los procesos con nolock, with
(rowlock) y evitando el cruce con algunas tablas pero el proceso continua
dando problemas, menos pero sigue, quisiera probar la manera que me
indicas, asi el usuario tenga la certeza que esta grabando su data de
manera correcta.


Muchas gracias.


Jesus


"Jose Mariano Alvarez"
escribió en el
mensaje news:
Por lo que se me ocurre es un problema de logica.
Que haces dentro de la transaccion?

Debes evitar hacer

BEGIN TRAN
Muchas operaciones que tardan
COMMIT

Eso no es viable si hay varias terminales haciendo lo mismo.
El DELETE en si mismo no es el problema sino "la gota que rebalsa el
vaso"
Si esa es la unica alternativa debes usar el nivel de aislamiento
SERIALIZABLE.

Si aun asi siguen los problemas deberias implenetar un semaforo con una
tabla.


Todo esto te va a hacer mas lento porque reduce la concurrencia.



Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:%
Buenas, la sentencia inferior sale error, pero revisando es porque en
distintas pc se utiliza el mismo numero de cuenta, y posteriormente es
insertado o eliminado el valor, por lo que en algunas funciona y en
otras pc no, me explico una pc elimina y luego inserta el valor, y la
otra cuando elimina le sale error porque el update o el insert lo tiene
bloqueado, de que manera puedo evitar, el proceso es muy pesado, pense
en agregar una columna que diga que pc lo inserta para que no se bloquee
con otra pc, espero me entiendan sino me dicen para explicarlo mas
tranquilo, jejejeje.


Delete FROM utb_valores_dinamica_contable -- with (READPAST)
WHERE VAR_NOMBRE_VARIABLE = @in_var_nro_cuenta
And (VAR_VALOR_VARIABLE = '@@ITF_MOTIVO'
OR VAR_VALOR_VARIABLE = '@@ITF_CARGO')


"Jose Mariano Alvarez"
escribió en el
mensaje news:
No le veo sentido al HINT fastfirstrow.

El delete es elegido como victima pero no es en si el problema sino la
duracion de las transacciones.

Tu problea es complejo de resolver.

Trata de usar buenos indices y hacer las transacciones mas pequeñas..




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Tengo esta sentencia
PRINT 'AQUI1'
DELETE FROM utb_valores_dinamica_contable with (FASTFIRSTROW)
WHERE VAR_COD_TRANSACCION = @in_var_trx
And VAR_COD_USUARIO = @in_usuario
PRINT 'AQUI2'

lo proble con (ROWLOCK) CON (UPDLOCK) pero no funciona, cuando ejecuto
los script en distintas maquinas, con distintos usuarios y la misma
transaccion sale lo siguiente

Servidor: mensaje 1205, nivel 13, estado 50, procedimiento
usp_mpc_prc_CargaInicial, línea 211
Transaction (Process ID 56) was deadlocked on lock resources with
another process and has been chosen as the deadlock victim. Rerun the
transaction.

la linea 211 es justamente el delete, porque en el resultado sale
aqui1 pero no imprime aqui2, saben si puede ser por algun service pack
que me este faltando?.

Y como puedo saber si tengo todos los service pack del sqlserver2000

Muchas gracias.



"Jose Mariano Alvarez"
escribió en
el mensaje news:
Que no tenga indices clustered no te va a provocar esos problemas que
has comentado en tu anterior post.

En lineas generales es conveniente que tenga un indice clustered,
pero no siempre debe ser el de la PK. El beneficio del clustered es
aprovechar para acceder a los registros de forma ordenada o cuando se
requiere un numero importante de accesos. En general el compromiso es
entre recorrer todas las paginas (SCAN) de la tabla o de un indice, o
accederlas puntualmente (SEEK) para lo cual te puede ayudar el
indice.





Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"fac" wrote in message
news:
Buenas, muchas gracias por los conocimientos y el apoyo, mas tarde
estare colocando el archivo del profiler a ver como me pueden ayudar
o como puedo analizarlo para ver el problema, pero tengo una
consulta adicional, este sistema que estoy viendo, ya esta
desarrollado casi en su totalidad, pero veo que las tablas no tienen
indices con cluster, tienen los pk pero sin cluster, que beneficio
tiene esto porque tengo entendido que toda tabla debe tener a menos
1 indice cluster, a menos que en caso especial no se coloque, muchas
gracias de antemano por las respuestas a esta consulta.

























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