Bloquear registros

13/08/2004 - 14:40 por Melissa Ruiz | Informe spam
Hola amigos,
Soy nueva en el foro.
Estoy empezando a aprender SQL server desarrollando una aplicacion en Visual
Foxpro 8.0 con base de datos sql server 2000.

Mi primera inquietud es que en un proceso guardo en una variable el valor de
un campo de una tabla, luego recorro otra tabla, hago unos calculos y
actualizo el campo del valor guardado previamente de la primera tabla.
Lo malo es que necesito que mientras dura el proceso de recorrer la otra
tabla y calcular, que puede durar unos segundos segun las pruebas, ningun
usuario debe de estar modificandome el valor del campo de la primera tabla.

Para los que conocen algo de Visual Fox lo que quiero es simplemente simular
un RLOCK() es decir bloquear el registro para que nadie me lo pueda
modificar hasta que yo lo libere.

Como se puede hacer eso en SQL Server ??? o en su defecto como maneja sql
server la concurrencia.

Entiendan que no se casi nada de sql server.

Gracias amigos

Melissa

Preguntas similare

Leer las respuestas

#1 Maxi
13/08/2004 - 14:48 | Informe spam
Melisa, deberiamos ver el proceso que realmente estas corriendo, pero Sql se
maneja muy distinto a Fox o cualquiera de ese tipo de bdd.

Si nos comentas mas detalladamente cual es el proceso y nos das ejemplos,
quizas podamos ayudarte con las facilidades que tiene Sql para ver como lo
resolvemos :-)


Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Melissa Ruiz" escribió en el mensaje
news:
Hola amigos,
Soy nueva en el foro.
Estoy empezando a aprender SQL server desarrollando una aplicacion en


Visual
Foxpro 8.0 con base de datos sql server 2000.

Mi primera inquietud es que en un proceso guardo en una variable el valor


de
un campo de una tabla, luego recorro otra tabla, hago unos calculos y
actualizo el campo del valor guardado previamente de la primera tabla.
Lo malo es que necesito que mientras dura el proceso de recorrer la otra
tabla y calcular, que puede durar unos segundos segun las pruebas, ningun
usuario debe de estar modificandome el valor del campo de la primera


tabla.

Para los que conocen algo de Visual Fox lo que quiero es simplemente


simular
un RLOCK() es decir bloquear el registro para que nadie me lo pueda
modificar hasta que yo lo libere.

Como se puede hacer eso en SQL Server ??? o en su defecto como maneja sql
server la concurrencia.

Entiendan que no se casi nada de sql server.

Gracias amigos

Melissa







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.732 / Virus Database: 486 - Release Date: 29/07/2004
Respuesta Responder a este mensaje
#2 Melissa Ruiz
13/08/2004 - 14:58 | Informe spam
Gracias por responder.

Fijate en una transaccion tengo un campo digamos datos1.balance cuyo
valor debo tomarlo (guardarlo en una variable). Luego tengo que recorrer
la tabla datos2 y sumar el campo datos2.valor y hacer un grupo de cálculos
(por ej. intereses, mora, etc.) y producir valor con el cual debo actualizar
(update) a datos1.balance (tambien basandome en la variable que guarde) y
dentro de la misma transaccion continuar utilizando el nuevo valor en otras
cosas. El problema es que mientras hago el calculo en datos2, ningun otro
usuario debe poder modificarme el campo datos1.balance hasta que concluya
totalmente la transaccion debido a que puede producirme resultados
inesperados. Son calculos que deben ser muy precisos y por eso la
necesidad del bloqueo.

Espero haberme explicado bien pues esto me tiene un poco complicada.





"Maxi" wrote in message
news:
Melisa, deberiamos ver el proceso que realmente estas corriendo, pero Sql


se
maneja muy distinto a Fox o cualquiera de ese tipo de bdd.

Si nos comentas mas detalladamente cual es el proceso y nos das ejemplos,
quizas podamos ayudarte con las facilidades que tiene Sql para ver como lo
resolvemos :-)


Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Melissa Ruiz" escribió en el mensaje
news:
> Hola amigos,
> Soy nueva en el foro.
> Estoy empezando a aprender SQL server desarrollando una aplicacion en
Visual
> Foxpro 8.0 con base de datos sql server 2000.
>
> Mi primera inquietud es que en un proceso guardo en una variable el


valor
de
> un campo de una tabla, luego recorro otra tabla, hago unos calculos y
> actualizo el campo del valor guardado previamente de la primera tabla.
> Lo malo es que necesito que mientras dura el proceso de recorrer la otra
> tabla y calcular, que puede durar unos segundos segun las pruebas,


ningun
> usuario debe de estar modificandome el valor del campo de la primera
tabla.
>
> Para los que conocen algo de Visual Fox lo que quiero es simplemente
simular
> un RLOCK() es decir bloquear el registro para que nadie me lo pueda
> modificar hasta que yo lo libere.
>
> Como se puede hacer eso en SQL Server ??? o en su defecto como maneja


sql
> server la concurrencia.
>
> Entiendan que no se casi nada de sql server.
>
> Gracias amigos
>
> Melissa
>
>



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.732 / Virus Database: 486 - Release Date: 29/07/2004


Respuesta Responder a este mensaje
#3 ulises
13/08/2004 - 15:20 | Informe spam
Tendrías que "empaquetar" todo tu conjunto de
actualizaciones dentro de una transacción.

BEGIN TRAN T1
sentencias t-SQL
...
IF @@error
ROLLBACK TRAN T1
ELSE
COMMIT TRAN T1

revisa el tema en el BOL (Books Online) que se encuentra
dentro de tu instalación de SQL, adicionalmente revisa el
tema de los bloqueos.

Saludos,
Ulises

Hola amigos,
Soy nueva en el foro.
Estoy empezando a aprender SQL server desarrollando una


aplicacion en Visual
Foxpro 8.0 con base de datos sql server 2000.

Mi primera inquietud es que en un proceso guardo en una


variable el valor de
un campo de una tabla, luego recorro otra tabla, hago


unos calculos y
actualizo el campo del valor guardado previamente de la


primera tabla.
Lo malo es que necesito que mientras dura el proceso de


recorrer la otra
tabla y calcular, que puede durar unos segundos segun las


pruebas, ningun
usuario debe de estar modificandome el valor del campo de


la primera tabla.

Para los que conocen algo de Visual Fox lo que quiero es


simplemente simular
un RLOCK() es decir bloquear el registro para que nadie


me lo pueda
modificar hasta que yo lo libere.

Como se puede hacer eso en SQL Server ??? o en su


defecto como maneja sql
server la concurrencia.

Entiendan que no se casi nada de sql server.

Gracias amigos

Melissa


.

Respuesta Responder a este mensaje
#4 Maxi
13/08/2004 - 15:37 | Informe spam
Ulises ya te ha respondido, lo mejor es usar una transaccion y meter todo
ahi!! pero tene cuidado de como armas las cosas, a ver si luego llegas a
tener grandes bloqueos y el motor se va a poner pesadito :(


Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Melissa Ruiz" escribió en el mensaje
news:
Gracias por responder.

Fijate en una transaccion tengo un campo digamos datos1.balance cuyo
valor debo tomarlo (guardarlo en una variable). Luego tengo que recorrer
la tabla datos2 y sumar el campo datos2.valor y hacer un grupo de cálculos
(por ej. intereses, mora, etc.) y producir valor con el cual debo


actualizar
(update) a datos1.balance (tambien basandome en la variable que guarde) y
dentro de la misma transaccion continuar utilizando el nuevo valor en


otras
cosas. El problema es que mientras hago el calculo en datos2, ningun


otro
usuario debe poder modificarme el campo datos1.balance hasta que concluya
totalmente la transaccion debido a que puede producirme resultados
inesperados. Son calculos que deben ser muy precisos y por eso la
necesidad del bloqueo.

Espero haberme explicado bien pues esto me tiene un poco complicada.





"Maxi" wrote in message
news:
> Melisa, deberiamos ver el proceso que realmente estas corriendo, pero


Sql
se
> maneja muy distinto a Fox o cualquiera de ese tipo de bdd.
>
> Si nos comentas mas detalladamente cual es el proceso y nos das


ejemplos,
> quizas podamos ayudarte con las facilidades que tiene Sql para ver como


lo
> resolvemos :-)
>
>
> Salu2
> Maxi
> Buenos Aires - Argentina
> Desarrollador Microsoft 3 Estrellas .NET
> Nunca consideres el estudio como una obligación sino como
> una oportunidad para penetrar en el bello y maravillosos
> mundo del saber.
> - Albert Einstein
>
>
>
> "Melissa Ruiz" escribió en el mensaje
> news:
> > Hola amigos,
> > Soy nueva en el foro.
> > Estoy empezando a aprender SQL server desarrollando una aplicacion en
> Visual
> > Foxpro 8.0 con base de datos sql server 2000.
> >
> > Mi primera inquietud es que en un proceso guardo en una variable el
valor
> de
> > un campo de una tabla, luego recorro otra tabla, hago unos calculos y
> > actualizo el campo del valor guardado previamente de la primera tabla.
> > Lo malo es que necesito que mientras dura el proceso de recorrer la


otra
> > tabla y calcular, que puede durar unos segundos segun las pruebas,
ningun
> > usuario debe de estar modificandome el valor del campo de la primera
> tabla.
> >
> > Para los que conocen algo de Visual Fox lo que quiero es simplemente
> simular
> > un RLOCK() es decir bloquear el registro para que nadie me lo pueda
> > modificar hasta que yo lo libere.
> >
> > Como se puede hacer eso en SQL Server ??? o en su defecto como maneja
sql
> > server la concurrencia.
> >
> > Entiendan que no se casi nada de sql server.
> >
> > Gracias amigos
> >
> > Melissa
> >
> >
>
>
>
> Outgoing mail is certified Virus Free.
> Checked by AVG anti-virus system (http://www.grisoft.com).
> Version: 6.0.732 / Virus Database: 486 - Release Date: 29/07/2004
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.732 / Virus Database: 486 - Release Date: 29/07/2004
Respuesta Responder a este mensaje
#5 Miguel Egea
13/08/2004 - 19:50 | Informe spam
Bueno mi opinión :-d

si las sentencias t-sql son de select y el nivel de aislajiento el por
defecto eso puede no funcionar como quiere meli¡a (no hay bloqueos por
lecturas...)

Sin embargo melisa lo que dices tiene una pinta de hacerse en una sola
instrucción (matemos un cursor :-d ) que no puede con ella.

Además te lo agradezco porque seguramente vaya a dar una conferencia
organizada por portalfox en coruña (España) y puede ser que la conferencia
la de sobre como eliminar cursores :-D


Imaginemos esta estructura
tabla1 (id, saldoacumulado)
tabla2 (id,orden,saldo), en donde saldoacumulado es la suma de los salods
que tienen el mismo id entabla 2.

Esto se actualizaría sin hacer un cursor así

/* codigo sin probar */

update t set saldoacumulado=saldoacumulado+totalsaldo from Tabla1 t inner
join (select id,Sum(saldo) TotalSaldo from tabla2 grouup by id) t2 on
t.id=t2.id

/* fin codigo sin probar */

La diferencia de rendimiento puede ser bastante considerable


-
Miguel Egea Gómez
Microsoft SQL-Server MVP
Webmaster de PortalSql.Com
¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?





"ulises" escribió en el mensaje
news:55f701c48138$3d19cff0$
Tendrías que "empaquetar" todo tu conjunto de
actualizaciones dentro de una transacción.

BEGIN TRAN T1
sentencias t-SQL
...
IF @@error
ROLLBACK TRAN T1
ELSE
COMMIT TRAN T1

revisa el tema en el BOL (Books Online) que se encuentra
dentro de tu instalación de SQL, adicionalmente revisa el
tema de los bloqueos.

Saludos,
Ulises

Hola amigos,
Soy nueva en el foro.
Estoy empezando a aprender SQL server desarrollando una


aplicacion en Visual
Foxpro 8.0 con base de datos sql server 2000.

Mi primera inquietud es que en un proceso guardo en una


variable el valor de
un campo de una tabla, luego recorro otra tabla, hago


unos calculos y
actualizo el campo del valor guardado previamente de la


primera tabla.
Lo malo es que necesito que mientras dura el proceso de


recorrer la otra
tabla y calcular, que puede durar unos segundos segun las


pruebas, ningun
usuario debe de estar modificandome el valor del campo de


la primera tabla.

Para los que conocen algo de Visual Fox lo que quiero es


simplemente simular
un RLOCK() es decir bloquear el registro para que nadie


me lo pueda
modificar hasta que yo lo libere.

Como se puede hacer eso en SQL Server ??? o en su


defecto como maneja sql
server la concurrencia.

Entiendan que no se casi nada de sql server.

Gracias amigos

Melissa


.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida