Cómo utilizar los tres niveles de bloqueo en VB 3.0 base de datos

Seleccione idioma Seleccione idioma
Id. de artículo: 113953 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

El manual de "Libreta de características profesionales 2" de Visual Basic 3.0 proporciona información sobre los tres métodos diferentes bloqueo que puede utilizar para controlar el acceso a datos multiusuario en las aplicaciones de Visual Basic. Esta información se aplica principalmente a la forma en el motor de Access controla el bloqueo para bases de datos ISAM y de acceso. Se incluyen notas en las bases de datos ODBC. Este artículo contiene ejemplos de código que muestran cada método. También se incluyen notas en uso el control de datos en una situación de multiusuario.

Más información

Cada uno de los ejemplos siguientes requiere las siguientes declaraciones de constante en la sección General Declarations de Form1:
Const MB_RETRYCANCEL = 5
Const MB_YESNO = 4
Const IDCANCEL = 2
Const IDNO = 7
Const DB_DENYWRITE = &H1
Const DB_DENYREAD   = &H2
Const ERR_RESERVED = 3000
Const ERR_CANT_OPEN_DB = 3051
Const ERR_CANT_LOCK_TABLE = 3262
Const ERR_DATA_CHANGED = 3197
Const ERR_RECORD_LOCKED = 3260
Const RERR_ExclusiveDBConflict = "-8194"
				

Los programas de ejemplo compruebe posibles conflictos de bloqueo multiusuario en los lugares adecuados en el código y informar al usuario con un cuadro de mensaje si detecta un conflicto. En la mayoría de los casos el código permite al usuario que vuelva a intentar la operación o Cancelar. Observe que el control en los ejemplos de errores es sólo para los propósitos de interceptar errores de bloqueo y necesitará código en una aplicación real de control de error mucho más amplio. Una breve explicación sigue cada ejemplo.

Ejemplo paso a paso para el nivel 1: bloqueo de base de datos

Este primer ejemplo es el más restrictivo. Se abre el objeto de base de datos para uso exclusivo, lo que impide que todos los otros usuarios tengan acceso a esa base de datos mientras está abierto.
  1. Inicie un proyecto nuevo de Visual Basic. Se creará Form1 de manera predeterminada.
  2. Agregue un botón de comando (Command1) y un cuadro de lista (List1) a Form1.
  3. Agregue el siguiente código para el Command1 procedimiento de evento click:
    Sub Command1_Click ()
      Dim db As database
      Dim ds As dynaset
      Dim ret As Integer
      Dim fSuccess As Integer
    
      ' Attempt to open database exclusively, checking for locking conflicts.
      fSuccess = False
          ' Disable any previous error handler
          ' and instead, just resume next
      On Error Resume Next
      While Not fSuccess
        Err = 0
        Set db = OpenDatabase("BIBLIO.MDB", True)
        If Err Then
          If Err = ERR_CANT_OPEN_DB Then
            ret = MsgBox("Database in use by another user.", MB_RETRYCANCEL)
            If ret = IDCANCEL Then Exit Sub
          Else
            MsgBox "Unexpected error" & Str$(Err) & " opening database."
            Exit Sub
          End If
        Else
          fSuccess = True
        End If
      Wend
      On Error GoTo 0 ' disable error trapping OR place On Error statements
                      ' pointing to a new error handler here
      ' Once the database is open we know we are accessing the data exclusively
      Set ds = db.CreateDynaset("Authors")
      Do Until ds.EOF = True
        If ds("Author") > " " Then list1.AddItem ds("Author")
        ds.MoveNext
      Loop
    
      ds.Close
      db.Close
    End Sub
    						
  4. En el menú Ejecutar, elija Inicio o presione la tecla F5 para ejecutar el programa. Haga clic en el botón Command1. Si otro usuario intenta abrir la base de datos Biblio.mdb al mismo tiempo que ejecuta el código enumerado anteriormente, obtendría un mensaje de error.
Tenga en cuenta que si está utilizando la capa de compatibilidad de Microsoft Access 2.0, recibirá un error reservado si no puede abrir la base de datos exclusivamente. En este caso, el error en tiempo de ejecución VB es err 3000, con el error reservado valor-8192. Para capturar este error en el código anterior, puede modificar la línea:
   If Err = ERR_CANT_OPEN_DB Then
				

para que indique:
   If Err = ERR_RESERVED And InStr(Error$, RERR_ExclusiveDBConflict) Then
				

Ejemplo paso a paso para el nivel 2: bloqueo de tabla o Dynaset

Este segundo ejemplo, el bloqueo de tabla o Dynaset se utiliza más a menudo. Es menos restrictivo a continuación, base de datos bloqueo, ya que permite tener acceso a otras tablas en la base de datos de otros usuarios. Este método establece las opciones DB_DENYWRITE y DB_DENYREAD al abrir un objeto Dynaset o el objeto de tabla. Mediante este método tienen la flexibilidad de bloqueo sólo los registros o tablas que trabaja en el momento, de modo que otros registros o tablas que pueden utilizarse por otros usuarios que utilicen la misma base de datos.

Hay una serie de variaciones de este nivel de bloqueo que puede tener acceso cambiando la configuración de opción.
  1. Inicie un proyecto nuevo de Visual Basic. Se creará Form1 de manera predeterminada.
  2. Agregue un botón de comando (Command1) y un cuadro de lista (List1) a Form1.
  3. Agregue el siguiente código para el Command1 procedimiento de evento click:
    Sub Command1_Click ()
      Dim db As database
      Dim ds As dynaset
      Dim ret As Integer, fSuccess As Integer
    
      Set db = OpenDatabase("BIBLIO.MDB")
    
      ' Attempt to open the dynaset, checking for locking conflicts.
      fSuccess = False
          ' Disable any previous error handler
          ' and instead, just resume next
      On Error Resume Next
      While Not fSuccess
        Err = 0
        Set ds = db.CreateDynaset("Authors", DB_DENYWRITE Or DB_DENYREAD)
        If Err Then
          If Err = ERR_CANT_LOCK_TABLE Then
            ret = MsgBox("Table(s) in use by another user.", MB_RETRYCANCEL)
            If ret = IDCANCEL Then Exit Sub
          Else
            MsgBox "Unexpected error" & Str$(Err) & " opening table."
            Exit Sub
          End If
        Else
          fSuccess = True
        End If
      Wend
      On Error GoTo 0 ' disable error trapping OR place On Error statements
                      ' pointing to a new error handler here
      ' Once the dynaset is open we know we are the only one accessing the data
      Do Until ds.EOF = True
        list1.AddItem ds(1)
        ds.MoveNext
      Loop
    
      ds.Close
      db.Close
    
    End Sub
    						
  4. En el menú Ejecutar, elija Inicio o presione la tecla F5 para ejecutar el programa. Haga clic en el botón Command1. Si otro usuario intenta actualizar la tabla authors cuando se está ejecutando el bucle de AddItem, obtendría un mensaje de error.
Bloqueo de nivel de tabla puede realizarse mediante los métodos AbrirTabla, CreateDynaset o CreateSnapShot pasando los valores adecuados como segundo parámetro una de estas funciones. Este método no se utiliza normalmente para instantáneas, como son de sólo lectura, y los cambios a los datos no afectarán normalmente una instantánea (con excepción de los campos memo - vea las notas de la sección al final de este artículo para obtener más información).

Ejemplo paso a paso para el nivel 3: bloqueo de página

Este tercer ejemplo muestra el bloqueo de página que se genera automáticamente el motor de base de datos. Es decir, si no proporciona el bloqueo de base de datos dinámico o tabla bloqueo, bloqueo de página se aplica automáticamente.

Hay dos tipos diferentes de la página bloqueos cuando se invoca el modo de edición optimista y pesimista. Bloqueo pesimista es el valor predeterminado. En el bloqueo pesimista, Visual Basic bloquea la página que contiene un registro tan pronto como se utiliza el método Edit y desbloquea la página cuando utiliza Update o Rollback. Utilizar bloqueo optimista cuando desea bloquear una página sólo en el tiempo de que actualizar los datos. Para ello se establecer propiedad LockEdits del registro.

Se exige el bloqueo de página por página. Una "página" se basa en el número de registros que quepan dentro de un bloque de 2048 bytes (o 2 KB) de memoria.

Puesto que están bloqueadas páginas enteras, y una página determinada puede contener más, a continuación, un registro, los usuarios no necesitan estar en el mismo registro exacto para provocar un conflicto de bloqueo. Por ejemplo, si los bloqueos de usuario A un registro al principio de una página y usuario B intenta hacer una edición de otro registro también está en esa página, el usuario B recibirá un error de bloqueo.

El mismo esquema de bloqueo se aplica a las páginas de índice. Cuando se utiliza el método Seek o están Regenerando índices, las páginas de índice se bloquean en una base de página de 2 KB. Esto puede provocar también errores de bloqueo, el programador debe controlar adecuadamente.
  1. Inicie un proyecto nuevo de Visual Basic. Se creará Form1 de manera predeterminada.
  2. Agregue un botón de comando (Command1) y un cuadro de lista (List1) a Form1.
  3. Agregue el siguiente código para el Command1 procedimiento de evento click:
    Sub Command1_Click ()
      Dim db As database
      Dim ds As dynaset
      Dim ret As Integer, fSuccess As Integer
    
      Set db = OpenDatabase("BIBLIO.MDB")
      Set ds = db.CreateDynaset("Authors")
    
      Do Until ds.EOF = True
      ' Attempt to access records, checking for possible page locking conflicts
        fSuccess = False
          ' Disable any previous error handler
          ' and instead, just resume next
        On Error Resume Next
        While Not fSuccess
          Err = 0
          ds.Edit
          If Err Then
            If Err = ERR_DATA_CHANGED Then
              ret = MsgBox("Record has been updated. Overwrite?", MB_RETRYCANCEL)
              If ret = IDNO Then fSuccess = True
            ElseIf Err = ERR_RECORD_LOCKED Then
              ret = MsgBox("Record in use by another user.", MB_RETRYCANCEL)
              If ret = IDCANCEL Then Exit Sub
            Else
              MsgBox "Unexpected error" & Str$(Err) & " editing record."
              Exit Sub
            End If
          Else
            fSuccess = True
          End If
        Wend
      On Error GoTo 0    ' disable error trapping OR place On Error statements
                         ' pointing to a new error handler here
    
      ds("Author") = ds("Author")
    
       ' With Optimistic locking you would check locking on Update vs. Edit
      ds.Update
      ds.MoveNext
    Loop
    
      ds.Close
      db.Close
    End Sub
    
    						
  4. En el menú Ejecutar, elija Inicio o presione la tecla F5 para ejecutar el programa. Haga clic en el botón Command1. Los registros que se incluyen en los resultados de conjunto que se se bloqueará los demás usuarios de totales hasta una página de 2 KB. Recibirán un mensaje de error si intentan abrir el registro cualquier en su conjunto de resultados.
Para el bloqueo optimista, quizá desee buscar errores de bloqueo en el método Update, en lugar los métodos de edición.

Multiusuario de Access con el control de datos

Mediante el control de datos es esencial el mismo que trabajar con los objetos de base de datos y conjuntos. El control de datos puede utilizar cualquiera de los tres niveles de bloqueo descritos anteriormente, como sigue:
  1. Bloqueo de base de datos: establezca la propiedad exclusiva en true.
  2. Bloqueo de tabla: establezca la propiedad opciones en el valor deseado. Estos valores son los mismos que los pasa como segundo parámetro a CreateDynaset.
  3. Bloqueo de página: Esto se controla en exactamente igual que un Dynaset objeto.
Nota: Si establece las propiedades de NombreDeBaseDeDatos o RecordSource de un control de datos en tiempo de diseño, el control de datos intentará automáticamente realizar el equivalente de un OpenDatabase y CreateDynaset cuando se carga el formulario que contiene el control de datos por primera vez.

Si se produce un error cuando el control de datos intenta abrir automáticamente el Database o Dynaset, el control de datos se desencadena su evento de error y pase el valor de error adecuado en tiempo de ejecución. Puesto que ningún código de Visual Basic se ejecuta en este momento, deberá controlar los posibles conflictos de bloqueo en el evento Error medio en lugar de on error.

Control de errores

Hay dos errores de tiempo de ejecución principales interceptar de con bloqueo del nivel de página. El primero es error 3260 "no se pudo actualizar; actualmente está bloqueado por el usuario" x "en el equipo"y".", que indica que otro usuario tiene la página que desee modificar bloqueado.

El segundo, error 3197 "datos ha cambiado; operación detenida." indica que los datos subyacentes de la base de datos se ha cambiado por otro usuario desde la última vez que recupera esa página de la física base de datos. Esto indica que alguien ha modificado el registro (o algún campo del registro) si estás utilizando un Dynaset o Snapshot que está intentando modificar.

Por ejemplo, si el usuario A crea un Dynaset de la tabla authors y extrae en la primera página (2 KB) de registros de la base de datos. El usuario B crea ahora un Dynaset idéntico, recuperar la misma 2 k de registros. Si un ahora actualiza el registro primero en el Dynaset usuario B no inmediatamente verá este cambio, ya que el usuario B ya se ha recuperado la primera página de registros y no hará tan nuevo a menos que éste actualiza el usuario vuelve a (crear) el dinámico.

Si ahora, el usuario B intenta modificar el primer registro de los conjuntos, admites recibirá el error de "datos ha cambiado; operación detuvo" Advertencia de que va a sobrescribir nuevos datos que no han recuperar nunca de la base de datos. Si vuelve a ejecutar la operación que provocó el "datos ha cambiado; operación detuvo" después de recibir el error una vez, los datos se sobrescribirán sin el error se genera una segunda vez.

Nota: Aunque el método AddNew no modifica los registros existentes, la página donde se agregará el nuevo registro sigue bloqueada cuando se ejecuta la instrucción Update para evitar que dos usuarios intente agregar datos en la misma ubicación en la base de datos. Esto significa que debe realizar las mismas comprobaciones de conflictos de bloqueo con AddNew que utilizas para el método Edit.

Notas de instantáneas

Error 3197 "datos ha cambiado; operación detenida." puede producirse por instantáneas que tienen los campos memo. Puesto que los campos memo normalmente son bastante grandes, el motor de Access no extrae todo el contenido de un campo memo en el SnapShot en el momento en que se crea; en su lugar, se almacena una referencia al campo memo en la base de datos en el SnapShot.

Si los datos en el campo memo está cambiado por otro usuario entre el momento que primero se rellena una instantánea (lo que significa que tiene acceso a un registro dado, utilizando los métodos Move o Find o visitar todos los registros, utilizando el método sn.MoveLast) y la hora ese registro es revisarse o se vuelve a hacer el registro actual, señalará el motor de base de datos que los datos cadudado invocando error 3197 en tiempo de ejecución.

NOTA EN ODBC

Al utilizar motores de datos externos, como Microsoft SQL Server, Sybase u Oracle mediante ODBC, la metodología de bloqueo es responsabilidad del motor de base de datos remota. Visual Basic actúa como un cliente a estos servidores de base de datos y no controla los aspectos de uso compartido de datos de los motores de base de datos back-end. En algunos casos, puede controlar cómo el servidor remoto bloquea los datos mediante instrucciones de SQL back-end específica o las opciones administrativas.

Algunas implicaciones del motor de Access aplazar a esquemas de bloqueo de back-end:
  1. El valor de LockEdits no tiene ningún efecto en bases de datos ODBC.
  2. Se omite el parámetro exclusivo del método OpenDatabase.
  3. La técnica mostrada en la sección "Paso a paso ejemplo de nivel 2: tabla o Dynaset bloqueo", producirá un error en bases de datos ODBC, con el error "ODBC: no se puede bloquear todos los registros".
  4. No se recomienda que el programador intente bloquear toda la tabla o toda la base de datos, utilizando sintaxis nativa de back-end, como puede ser perjudicial para el rendimiento en un entorno de transacciones de gran volumen.
  5. Incorporar sofisticados control reaccionar correctamente contención de bloqueo produce es la forma confiable sólo de que el motor de base de datos back-end operar a su nativo bloqueo esquema para el rendimiento máximo de errores.

Mostrar cómo llamar A FreeLocks después aparece un error de bloqueo de ejemplo


En determinadas circunstancias, especialmente en un entorno de intensa contención multiusuario, puede recibir el motor de acceso local fuera de sincronización con el host (el programa VB). Cuando esto sucede, la instrucción FreeLocks proporciona una manera para permitir que el motor 'catch ' y desactive bloquea cualquier sobrante. Los FreeLocks método indica al motor para realizar su procesamiento inactivo predeterminado, incluyendo liberar bloqueos que ya no están en utilizan pero no han agotado todavía.

A continuación es un ejemplo que muestra cómo llamar al método FreeLocks después se produzca un error de bloqueo en un sistema multiusuario. El código siguiente es un ejemplo de una rutina de reventado de error que se comprueba si un registro está bloqueado en un sistema multiusuario:
Sub EditRecord(ds as dynaset)
   On Error Goto ErrLock
   ds.lockedits = True  ' Return lock errors on Edit call, not the update.

Retry:
   ds.Edit
   ds.fields(0).value = "Something"
   ds.fields(0).value = "Else"
   ds.update
   exit sub

ErrLock:
   ds.bookmark = ds.bookmark  ' Cancel the update.
   FreeLocks
   tm = timer
   ' Wait 3 seconds:
   while timer - tm < 3
      doevents
   wend
   resume Retry
End Sub
				

Referencias

La información en este artículo procede de las siguientes secciones en el manual "Libreta de características profesionales 2"."
  • Bloqueo de datos
  • Bloqueo de bases de datos
  • Bloqueo de tablas y conjuntos de registros dinámicos
  • Bloqueo de páginas
Consulte el capítulo 3, en página 54 y páginas 87 mediante 91 para obtener más información en estas áreas.

Propiedades

Id. de artículo: 113953 - Última revisión: miércoles, 08 de enero de 2003 - Versión: 1.1
La información de este artículo se refiere a:
  • Microsoft Visual Basic 3.0 Professional Edition
Palabras clave: 
kbmt KB113953 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 113953
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com