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

#6 1492a2001
14/08/2004 - 00:29 | Informe spam
"Miguel Egea" wrote in message news:...
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...)




Se puede pasar el indicador UPDLOCK para que utilice bloqueos de
actualización en lugar de bloqueos compartidos. El pseudocódigo sería
como:

Abrir conexión
Abrir transacción

SELECT valor
FROM tabla1 WITH (UPDLOCK)
WHERE item = <el_item_en_cuestion>

"Esto genera un bloqueo de actualización que impide actualizaciones"

Ejecutar consulta2
Hacer calculos
Actualizar tabla1
COMMIT

Resto de operaciones...

Pero la solución ideal seria crear un procedimiento almacenado al que
se le pasaran los parámtros necesarios.

Un saludo.
Respuesta Responder a este mensaje
#7 ulises
14/08/2004 - 00:58 | Informe spam
El UPDLOCK no impide la lectura del registro y que en base
a ello se tomen ciertas acciones que podrían dar
resultados incorrectos. Por ejemplo :

BEGIN TRAN
SELECT @campo FROM TABLA WITH (UPDLOCK)
...
UPDATE
...
UPDATE TABLA SET @campo = xxx
COMMIT

el SELECT no bloquea el registro y puede ser leido por
otra transacción TRAN2 y tomar acciones sobre ese valor,
pero como se ve luego en la transacción se modifica y se
debería haber tomado ese nuevo valor para los cálculos de
la transacción TRAN2. Creo que hace algunos días se
conversó sobre este tema y se vió que era preferible hacer
la selección y actualización en una misma sentencia UPDATE
de manera de bloquear la fila.

Saludos,
Ulises

"Miguel Egea" wrote


in message news:...
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...)




Se puede pasar el indicador UPDLOCK para que utilice


bloqueos de
actualización en lugar de bloqueos compartidos. El


pseudocódigo sería
como:

Abrir conexión
Abrir transacción

SELECT valor
FROM tabla1 WITH (UPDLOCK)
WHERE item = <el_item_en_cuestion>

"Esto genera un bloqueo de actualización que impide


actualizaciones"

Ejecutar consulta2
Hacer calculos
Actualizar tabla1
COMMIT

Resto de operaciones...

Pero la solución ideal seria crear un procedimiento


almacenado al que
se le pasaran los parámtros necesarios.

Un saludo.
.

Respuesta Responder a este mensaje
#8 Melissa Ruiz
14/08/2004 - 04:06 | Informe spam
Gracias a todos. Muy amables.


"Melissa Ruiz" wrote in message
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


Respuesta Responder a este mensaje
#9 1492a2001
14/08/2004 - 16:14 | Informe spam
"ulises" wrote in message news:<60a001c48189$03986c40$...
El UPDLOCK no impide la lectura del registro y que en base



¿Y eso que tiene que ver con el hilo?, si vuelves a leer detenidamente
el contenido del mensaje inicial lo que se quiere es que otros
procesos no puedan modificar el valor, en ningún momento se dice que
no puedan leerlo, sólo se pide como impedir que otro proceso lo
modifique después de ser leido.

a ello se tomen ciertas acciones que podr an dar
resultados incorrectos. Por ejemplo :



Estás haciendo suposiciones, casos hipotéticos que no vienen al tema.
Como dice Date también puede pasar que los aviones se caigan y lo
puentes se derrumben.


BEGIN TRAN
SELECT @campo FROM TABLA WITH (UPDLOCK)
...
UPDATE
...
UPDATE TABLA SET @campo = xxx
COMMIT

el SELECT no bloquea el registro y puede ser leido por
otra transacci n TRAN2 y tomar acciones sobre ese valor,
pero como se ve luego en la transacci n se modifica y se
deber a haber tomado ese nuevo valor para los c lculos de
la transacci n TRAN2. Creo que hace algunos d as se
convers sobre este tema y se vi que era preferible hacer
la selecci n y actualizaci n en una misma sentencia UPDATE
de manera de bloquear la fila.



Que sea preferible o idónea no significa que sea la adecuada para este
caso particular, no hay información suficiente sobre el sistema en
particular. Mismo en tu propuesta no asumes la posibilidad de una
transacción distribuida o que el cálculo a realizar no sea
viable/eficiente/adecuado con T-SQL.

Un saludo.


Saludos,
Ulises
Respuesta Responder a este mensaje
#10 ulises
14/08/2004 - 22:01 | Informe spam
On 14 Aug 2004 07:14:20 -0700, (el emperador)
wrote:

"ulises" wrote in message news:<60a001c48189$03986c40$...
El UPDLOCK no impide la lectura del registro y que en base



¿Y eso que tiene que ver con el hilo?, si vuelves a leer detenidamente
el contenido del mensaje inicial lo que se quiere es que otros
procesos no puedan modificar el valor, en ningún momento se dice que
no puedan leerlo, sólo se pide como impedir que otro proceso lo
modifique después de ser leido.



He vuelto a leer el hilo de mensajes y no encontré tal cosa ya que lo
que he respondido es la réplica que haces a Miguel sobre su afirmación
de que no hay bloqueos por lecturas ... en todo caso si afirmas que tu
intención era responder directamente al mensaje inicial no tomes en
consideración mi mensaje :)


a ello se tomen ciertas acciones que podr an dar
resultados incorrectos. Por ejemplo :



Estás haciendo suposiciones, casos hipotéticos que no vienen al tema.
Como dice Date también puede pasar que los aviones se caigan y lo
puentes se derrumben.



¿? no sé a que viene ese tema, pero en todo caso no pienso que los
aviones se caigan o que los puentes se derrumben sean temas
hipóteticos sino bien reales y te aseguro que los responsables hacen
todo lo posible (inclusive planteandose situaciones poco probables)
para que eso no ocurra.

Un saludo.



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