Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Asunto: Re: Acceso concurrente a registro de SQL Server

13 views
Skip to first unread message

Francisco Rivera

unread,
Dec 20, 2005, 5:36:02 PM12/20/05
to
Saludos a Todos. El día de ayerconsulté un caso que muyu amablemente The_Ma3x
me orientó un poco sobre como tratar de resolverlo. Pero sigo atorado a pesar
de haber intentado con muchas opciones.
Básicamente lo que quiero hacer es presentar un registro en un formulario,
si un segundo usuario pide un registro de la base, que no le presente el
mismo. Lo hacía en base a los bloqueos: si el primer registro estaba
bloqueado, capturaba el error y saltaba al siguiente sin bloquear. En Access
funcionaba a la perfección, pero al migrar la base a SQL Server, esto ya no
funciona.
Gracias por cualquier ayuda.

>para abrir la conexión uso la siguiente línea (previas
>declaraciones)
>miDB.Open "Provider=SQLOLEDB; Initial Catalog=GtosFun; Data
>Source=CPQDBSVR\DBDESA; integrated security=SSPI; persist security >info=True;"
>
>Y después, el código que utilizo para abrir el recordset y lo demás , es el
>siguiente:
>
>Private Sub Cargando()
>On Error GoTo ManejoErr
>Dim xSt as String
> 'Vamos cargando los datos en el formulario
> rsCli.CursorLocation = adUseServer
> xSt = “SELECT TOP 20 NomCte, Domicilio, Colonia, Tel, CP, Ocup FROM
>Clientes WHERE StatLlam Is Null AND Ocup Is Null AND CitaAs Is Null”
>
> rsCli.Open xSt, miDB, adOpenKeyset, adLockPessimistic, adCmdText
> rsCli.MoveFirst
>
> If rsCli.EOF Or rsCli.BOF Then
> 'Si no se encuentra un registro, nos movemos al fin del archivo
> MsgBox "No existen más registros disponibles..", 16, "No hay
>registros..."
> rsCli.Close
> Set rsCli = Nothing
> Exit Sub
> Else
> 'Si se encuentra un registro
> GoTo CargaDatos
> End If
>
>CargaDatos:
> On Error GoTo ManejoErr
> 'Editamos un campo para marcarlo como bloqueado
> rsCli.Fields("Ocup") = "Oc"
> 'Desactivamos la rutina de errores
> On Error GoTo 0
> 'Llamamos la procedimiento que carga los controles
> CargarControles
>
>‘Rutina de manejo de errores
>ManejoErr:
> NoError = Err.Number
> Select Case NoError
> Case 0
> Debug.Print "No hubo error"
> ‘Capturamos el error en caso de registro bloqueado
> Case -2147467259
> ‘Si está bloqueado, brincamos al siguiente
> rsCli.Move 1
> GoTo CargaDatos
> Case Else
> MsgBox "Error No: " & Err.Number & vbCr & "Descripción: " &
>Err.Description
> End Select
>End Sub


>Saludos a todos y gracias de antemano por toda la ayuda...
>Anteriormente tenía una aplicacióin desarrollada en VB 6 y Access como base
>datos, en la cual varios usuarios solicitaban un registro a la base y tenía
>que bloquear el registro y mostrar uno diferente a cada usuario. Esto me
>funcionaba bien al capturar el error al querer editar un registro que ya
>estaba bloqueado, pues brincaba al siguiente y así...
>Para mostrar esos registros, hacía un "SELECT TOP 20 NomCte... etc" y hacía
>un Recordset.MoveFirst para colocarme en el primero.
>Ahora he migrado la base de datos a SQL Server, cambiando las cadenas de
>conexión y todo pero al pedir un registro, solo me da al primer usuario.. los
>demás usuarios ya no les muestra registros. al hacer una revisión paso a
>paso, la ejecución del código se queda en el Recordset.MoveFirst y ya no sale
>de ahí...
>Los bloqueos de registro me funcionan igual que en Access (el registro
>editado no puede editarse por nadie más).
>Ojalá alguien pueda ayudarme para ver porque solo me muestra el primer
>registro y al siguiente usuario ya se queda bloqueado.....
>Gracias por su ayuda...


Alex Martínez

unread,
Dec 21, 2005, 2:59:48 AM12/21/05
to
Aunque no esté ofreciéndote una solución.... permíteme que te pregunte cuál
es la necesidad de bloquear un registro cuando un usuario lo está
consultando. A priori, me parece una práctica peligrosa, muy poco eficiente
y que es contraria a la escalabilidad de la aplicación (con dos usuarios
puede no ser problemático, pero imagina una aplicación con 100 o 1000
usuarios bloqueando registros de esa forma...). Lo más sensato parece
bloquear los datos sólo cuando es imprescindible (es decir, cuando se están
actualizando) y el menor tiempo posible (es decir, lo que dure la operación
atómica - transacción - que se esté llevando a cabo).

--
Saludos,
Alex
[MS-MVP Visual Basic]


"Francisco Rivera" <Francis...@discussions.microsoft.com> escribió en
el mensaje news:F3177FAF-9FA3-42EF...@microsoft.com...

the_ma3x

unread,
Dec 21, 2005, 11:07:30 AM12/21/05
to
Se me ocurre una posible solución, pensando en lo que comenta Alex,
acerca de lo poco conveniente de bloquear registros...

Porque no creas una tabla, en la que almacenes los registros que se
encuentran bloqueados. Es decir, cuando asignes un registro a un
usuario, simplemente lo anexas a esa tabla (su id) y al salir lo borras
de esa tabla. Sobra decir que cuando asignes un nuevo registro, buscas
primero que el seleccionado no este en esa tabla.

Espero te sirva.
Un saludo

Victor Koch arroba punto punto punto

unread,
Dec 21, 2005, 11:15:17 AM12/21/05
to
Para que quiero un sistema multiusuario y gastar plata en una red si dos o
mas usuarios no pueden consultar al mismo tiempo el mismo registro.

--
Un saludo, Víctor Koch.


"the_ma3x" <mgri...@gmail.com> escribió en el mensaje
news:1135181250.5...@g49g2000cwa.googlegroups.com...

Lluís Franco

unread,
Dec 21, 2005, 11:19:46 AM12/21/05
to

Hola,

A lo que se refiere Alex es a que no conviene dejar bloqueados los registros
durante su edición.
Hay dos tipos de bloqueos "pesimista" y "optimista", el más restrictivo y
que penaliza más en un entorno grande es el primero, y es el que propones.
Mejor bloquear el registro sólo durante el breve instante de su
actualización y siempre dentro del contexto de una transacción.

Saludos,
--

Lluís Franco i Montanyés
[MS-MVP-MCP Visual Basic]

This posting is provided "AS IS" with no warranties, and confers no rights.
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho

--
(Guía de netiquette del foro)
http://www.uyssoft.com/MSNews.aspx?sm=10
FIMARGE, S.A.
Principat d'Andorra
lfranco@ODIO_EL_SPAMfimarge.ad
Tel.: +376 805 100
Fax: +376 824 500
Mi Perfil MVP en:
https://mvp.support.microsoft.com/profile=02aa1615-1a2f-4202-bc3f-aec297d967d2

Alex Martínez

unread,
Dec 21, 2005, 11:55:20 AM12/21/05
to
"Lluís Franco" <msn...@uyssoft.com> escribió en el mensaje
news:%23J5Gpok...@TK2MSFTNGP11.phx.gbl...

>
> Hola,
>
> A lo que se refiere Alex es a que no conviene dejar bloqueados los
> registros
> durante su edición.

y aún menos durante su consulta, que es lo que me parece que intenta hacer
Francisco...

Francisco Rivera

unread,
Dec 21, 2005, 5:12:02 PM12/21/05
to
Ok, explico porque lo del bloqueo, o tal vez yo soy el que estoy planteando
mal mi solución.
El sistema es para un call center de venta de seguros. Hay una base de datos
ya precargada con registros. El usuario, en su Front End, da click en un
botón que dice "Seleccionar Cliente", lo que hace que se selecciona el primer
registro que cumple con cierto criterios (por ejemplo, que no tenga una cita
asignada a otro usuario anteriormente y que no se le haya realizado una
venta). Una vez que encuentra un registro que cumple con eso, lo muestra en
el formulario, para que se haga la venta. Si dos usuarios dan click en
"Seleccionar Cliente" al mismo tiempo, no debe de mostrarle el mismo cliente
a los dos, ya que entonces los dos le estarían vendiendo al mismo cliente..
me explico ???
Lo del bloqueo lo necesito simplemente para que al momento de seleccionar un
cliente, me capte cual de los registros (que pueden ser hasta 20 porque hago
un SELECT TOP 20) se está ocupando ya y brinque al siguiente que no esté
bloqueado.
Ahora, lo que intenté hacer anteriormente fué que al seleccionar un cliente,
me actualice un campo de la tabla y lo marque como "Ocupado" y haga un
update, de esa forma en el SELECT puedo poner el criterio de que me tome solo
los que no están ocupados, pero al parecer esto es demasiado lento (claro,
milésimas de segundo) porque al hacerlo así, siempre me muestra al mismo
cliente a dos usuarios.
Gracias por la ayuda, y espero con esto haber aclarado un poco de porque
necesito eso..
Gracias y espero sus comentarios.


"Francisco Rivera" escribió:

0 new messages