Niveles de aislamiento de transacciones en Babelfish
Babelfish admite los niveles de aislamiento de transacciones READ UNCOMMITTED
, READ COMMITTED
y SNAPSHOT
A partir de la versión 3.4 de Babelfish, se admiten los niveles de aislamiento adicionales: REPEATABLE READ
y SERIALIZABLE
. Todos los niveles de aislamiento de Babelfish son compatibles con el comportamiento de los niveles de aislamiento correspondientes en PostgreSQL. SQL Server y Babelfish utilizan diferentes mecanismos subyacentes para implementar los niveles de aislamiento de las transacciones (bloqueo del acceso simultáneo, bloqueo de las transacciones, gestión de errores, etc.). Además, existen algunas diferencias sutiles en el posible funcionamiento del acceso simultáneo para diferentes cargas de trabajo. Para obtener más información sobre este comportamiento de PostgreSQL, consulte Aislamiento de transacciones
Temas
Información general sobre los niveles de aislamiento de transacciones
Los niveles de aislamiento de transacciones originales de SQL Server se basan en un bloqueo pesimista en el que solo existe una copia de los datos y las consultas deben bloquear los recursos, por ejemplo las filas, antes de acceder a ellos. Más adelante, se introdujo una variación del nivel de aislamiento READ COMMITTED
. Esto permite el uso de versiones de filas para proporcionar una mejor simultaneidad entre lectores y escritores mediante el acceso sin bloqueo. Además, está disponible un nuevo nivel de aislamiento denominado SNAPSHOT
. También utiliza versiones de filas para ofrecer una mayor simultaneidad que el nivel de aislamiento REPEATABLE READ
, ya que evita el bloqueo compartido de los datos de lectura, que se retienen hasta el final de la transacción.
A diferencia de SQL Server, todos los niveles de aislamiento de transacciones de Babelfish se basan en el bloqueo positivo (MVCC). Cada transacción ve una instantánea de los datos al principio de la declaración (READ COMMITTED
) o al principio de la transacción (REPEATABLE READ
, SERIALIZABLE
), independientemente del estado actual de los datos subyacentes. Por lo tanto, el comportamiento de ejecución de las transacciones simultáneas en Babelfish puede diferir del de SQL Server.
Por ejemplo, consideremos una transacción con un nivel de aislamiento SERIALIZABLE
que inicialmente está bloqueada en SQL Server, pero que se realiza correctamente más adelante. Puede terminar fallando en Babelfish debido a un conflicto de serialización con una transacción simultánea que lee o actualiza las mismas filas. También puede haber casos en los que la ejecución de varias transacciones simultáneas arroje un resultado final diferente en Babelfish en comparación con SQL Server. Las aplicaciones que utilizan niveles de aislamiento deben probarse exhaustivamente para detectar escenarios de simultaneidad.
Niveles de aislamiento en SQL Server | Nivel de aislamiento de Babelfish | Nivel de aislamiento de PostgreSQL | Comentarios |
---|---|---|---|
|
|
|
|
|
|
|
El |
|
|
|
Ambas están basadas en instantáneas (MVCC), pero no son exactamente iguales. |
|
|
|
Exactamente igual. |
|
|
|
El |
|
|
|
El |
nota
Las sugerencias de la tabla no son compatibles actualmente y su comportamiento se controla mediante la escotilla de escape predefinida de Babelfish escape_hatch_table_hints
.
Configuración de los niveles de aislamiento de las transacciones
Utilice el siguiente comando para establecer el nivel de aislamiento de las transacciones:
SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SNAPSHOT | SERIALIZABLE }
Activación o desactivación de los niveles de aislamiento de transacciones
Los niveles de aislamiento de transacciones REPEATABLE READ
y SERIALIZABLE
están deshabilitados de forma predeterminada en Babelfish y hay que activarlos de manera explícita configurando la escotilla de escape babelfishpg_tsql.isolation_level_serializable
o babelfishpg_tsql.isolation_level_repeatable_read
como pg_isolation
utilizando sp_babelfish_configure
. Para obtener más información, consulte Administración de la gestión de errores de Babelfish con escotillas de escape.
A continuación se muestran ejemplos de cómo habilitar o deshabilitar el uso de REPEATABLE READ
y SERIALIZABLE
en la sesión actual configurando sus respectivas escotillas de escape. Si lo desea, puede incluir un parámetro server
para establecer la escotilla de escape de la sesión actual y de todas las sesiones nuevas subsiguientes.
Para habilitar el uso de SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
solo en la sesión actual.
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation'
Para habilitar el uso de SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
en la sesión actual y en todas las nuevas sesiones simultáneas.
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'pg_isolation', 'server'
Para deshabilitar el uso de SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
en la sesión actual y en las nuevas sesiones posteriores.
EXECUTE sp_babelfish_configure 'isolation_level_repeatable_read', 'off', 'server'
Para habilitar el uso de SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
solo en la sesión actual.
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation'
Para habilitar el uso de SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
en la sesión actual y en todas las nuevas sesiones simultáneas.
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'pg_isolation', 'server'
Para deshabilitar el uso de SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
en la sesión actual y en las nuevas sesiones posteriores.
EXECUTE sp_babelfish_configure 'isolation_level_serializable', 'off', 'server'