La consistencia de la base de datos es también uno de los indicadores importantes para medir el rendimiento del SGBD. Actualmente, la mayoría de las bases de datos comerciales (DB2, SQL Server) utilizan el protocolo de Bloqueo Bifásico (2PL) para el control de concurrencia, lo que garantiza la serialización de la ejecución concurrente de transacciones. Sin embargo, 2PL necesita bloquear cualquier dato antes de poder leerlos o escribirlos. En la matriz de compatibilidad de bloqueo, los bloqueos S (bloqueos de compartición) y X (bloqueos exclusivos) son incompatibles, así que cuando la transacción 1 realiza una operación de lectura sobre los datos A (más un bloqueo S), y la transacción 2 quiere escribir en los datos (añadir un bloqueo X), la transacción 2 debe esperar a que la transacción 1 libere el bloqueo S sobre los datos A antes de continuar. El Control de Concurrencia Multi-Versión (MVCC) resuelve bien este problema. En un sistema de múltiples versiones, cada dato de escritura genera una nueva versión, y la operación de lectura puede leer la versión correspondiente según sea necesario, de modo que las operaciones de lectura y escritura no se bloqueen mutuamente. MVCC aumenta la concurrencia, pero también introduce la sobrecarga de almacenamiento de mantener múltiples versiones.
El motor de base de datos Microsoft SQL Server introduce una nueva implementación del nivel de aislamiento de transacciones existente: lecturas comprometidas, que proporcionan instantáneas a nivel de declaración mediante versionamiento de filas. El motor de base de datos de SQL Server también introduce un nuevo nivel de aislamiento de transacciones: instantáneas para proporcionar instantáneas a nivel de transacción que también utilizan versionado de filas.
Configurar la opción de base de datos READ_COMMITTED_SNAPSHOT en ON permite el aislamiento de lectura comprometido mediante el versionado de filas. Configurar la opción de la base de datos ALLOW_SNAPSHOT_ISOLATION en ON activa el aislamiento de instantáneas. Cuando cualquiera de las dos opciones está habilitada para la base de datos, el motor de la base de datos mantiene la versión de cada fila modificada. Siempre que una transacción modifica una fila, la imagen de la fila anterior a la modificación se copia a una página en la tienda de versiones. Un almacén de versiones es una colección de páginas de datos en tempdb. Si hay múltiples líneas de modificación de transacciones, varias versiones de esas líneas se enlazarán en una cadena de versiones. Una operación de lectura usando versionado de filas recuperará la última versión de cada fila que se comprometió en el momento del inicio de la transacción o sentencia.
Las aplicaciones escritas para SQL Server 2008 o nuevas en SQL Server implementan aislamiento de comits de lectura usando versionado de filas especificando el nivel de aislamiento de transacciones para los commits de lectura cuando la opción de base de datos READ_COMMITTED_SNAPSHOT está activada. Todas las lecturas verán la versión de la fila que se hizo al comenzar la declaración. Esto proporcionará una instantánea a nivel de sentencia de los datos.
Las aplicaciones escritas para SQL Server implementarán el aislamiento de instantáneas especificando el nivel de aislamiento de transacciones instantáneas cuando la opción de base de datos de ALLOW_SNAPSHOT_ISOLATION esté activada. Todas las lecturas en una transacción instantánea verán la versión de la fila que se comprometió cuando comenzó la transacción. Esto proporcionará una instantánea a nivel de transacción de los datos.
Para transacciones que utilizan niveles de aislamiento basados en filas, las lecturas no solicitan bloqueos compartidos sobre los datos. Esto significa que los lectores que usan versionado por filas no impiden que otros lectores o escritores accedan a los mismos datos. De igual modo, el escritor no se interpone en el camino del lector. Sin embargo, los escritores se interponen entre sí (incluso cuando se usan a cierto nivel de aislamiento basado en la versión de filas). Dos operaciones de escritura no pueden modificar los mismos datos al mismo tiempo.
La función de Aislamiento de Instantáneas amplía el marco de bloqueo en SQL Server 2008 al permitir que las aplicaciones vean los valores antes de que ocurran modificaciones de datos. Esto evita que la aplicación se bloquee mientras sigue proporcionando datos realmente enviados. La instantánea de lectura comprometida de SQL Server 2008 requiere que un administrador de base de datos se active, permitiendo que los datos sean leídos mediante transacciones de solo lectura. Así que el control de concurrencia de SI sobre transacciones de solo lectura es muy bueno, pero no está claro si este es el caso de las transacciones de actualización. Es más desfavorable que las transacciones de actualización a largo plazo compitan con las transacciones de alto nivel a corto plazo. Si una transacción entre bases de datos intenta usar el estándar de Aislamiento de Instantáneas (SI), en lugar de todas las bases de datos establecidas, la transacción falla. Esto, sin duda, crea ciertos obstáculos para la escalabilidad. Parece que Microsoft aún tiene mucho camino por recorrer para lograr su propia SI que sea más fuerte que la especificación SQL 92.
Antes de cualquier modificación, haz una copia de la versión anterior, y todas las operaciones de lectura posteriores leerán la versión copiada, y la modificación creará una nueva versión. De este modo,Las operaciones de lectura y escritura no se bloquean mutuamente. La ventaja de usar este mecanismo de versionado de línea es que la concurrencia del programa es relativamente alta, pero la desventaja es que, aunque el usuario no lee un dato sucio, puede ser un valor de dato que está siendo modificado y está a punto de expirar. Si modificas los datos en función de este valor caducado, causará un error lógico。
Comandos SQL:
Enlaces de referencia:
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.
El inicio de sesión del hipervínculo es visible.
|