Ir al contenido principal

¿Es posible cambiar el modo de transacciones explícitas (auto commit) de SQL Server? ¿IMPLICIT_TRANSACTIONS ON or OFF?

Este capítulo explica los comportamiento de transacciones explícitas (explicit transactions ó autocommit) y transacciones implícitas (implicit transactions), ambos disponibles en SQL Server (por defecto se utilizan transacciones explícitas). Se explica la relacción de estos comportamientos con la sentencia BEGIN TRAN y con los modos de aislamiento, así como con las transacciones anidadas (nested transactions). Se explica también como establecer el modo de transacciones explícitas o implícitas (sentencia SET IMPLICIT_TRANSACTIONS), etc.

SQL Server utiliza por defecto el modo de transacciones explícitas (el conocido auto commit), lo cual implica que , que la ejecución de una sentencia DML (ej: UPDATE) se confirma automáticamente. Por ello, si deseamos ejecutar varias sentencias DML (ej: varios UPDATE), será necesario de forma explícita iniciar una transacción (BEGIN TRAN), ejecutar las sentencias DML deseadas, y finalmente confirmar o deshacer la transacción (COMMIT ó ROLLBACK). De aquí la denominación de transacciones explícitas (IMPLICIT_TRANSACTIONS OFF) para el modo de funcionamiento con auto commit.
Este modo de comportamiento resulta sorprendente para muchos administradores y programadores de base de datos que llegan a SQL Server desde ORACLE (recordar, que otros motores como INFORMIX o Sybase, funcionan igual que SQL Server). El motivo es queORACLE utiliza transacciones implícitas, es decir, siempre que se inicia una nueva sesión o se confirma o deshace (COMMIT o ROLLBACK) la transacción actual, se inicia una nueva transacción. Resulta de interés observar, que en el modo de transacciones implícitas, NO es necesario iniciar la transacción explícitamente con un BEGIN TRAN, sin embargo, deberemos recordar confirmar o deshacer (COMMIT ó ROLLBACK) la transacción, ya que si la sesión finaliza sin haber confirmado los cambios, se realizará un ROLLBACK y se perderán dichos cambios.
En SQL Server es posible utilizar el modo de transacciones implícitas (sin auto commit - IMPLICIT_TRANSACTIONS ON), y disfrutar de éste modo de funcionamiento. Evidentemente, al trabajar en el modo de transacciones implícitas, es posible utilizar BEGIN TRAN para iniciar transacciones anidadas (igual que es posible utilizar transacciones anidadas en modo auto commit).
Llegados a éste punto, surge la siguiente pregunta ¿Por qué los motores como SQL Server e Informix utilizan transacciones explícitas mientras que ORACLE utiliza transacciones implícitas? Me alegra que te hagas esta pregunta ! Esto es debido a que el funcionamiento de ORACLE se basa en el versionado de filas (row versioning - y NO en los bloqueos), por lo cual, al iniciar una transacción puede pasar todo el tiempo que sea necesario, que otras transacciones podrán realizar lecturas correctamente (accediendo a la versión correcta de cada filas). Sin embargo, el funcionamiento de SQL Server se basa en los bloqueos, de tal modo que al iniciar la transacción, según se ejecuten las DML (ej: los UPDATES) se crearán bloqueos en las filas correspondientes (corriendo el riesgo de que puedan escalar a bloqueos de página o incluso a bloqueos de tabla) luego las lecturas realizadas por otras transacciones quedarán bloqueadas (excepto que se utilicen el modo de aislamiento de lecturas sucias - READ UNCOMMITTED -, pero por defecto el modo de aislamiento es READ COMMITTED), impactando en el rendimiento y tiempo de respuesta.
A todo esto, el hecho de que el funcionamiento de ORACLE se base en el versionado de filas, no implica que NO se puedan generar bloqueos. De hecho, al programar procesos con PL/SQL en ORACLE (ej: regularizaciones de fin de mes, facturaciones, etc.), muchos programadores utilizan sentencias del tipo SELECT FOR UPDATE, por poner un ejemplo.
Desde SQL Server 2005, es posible utilizar el modo de transacciones implícitas junto con el versionado de filas, si realmente deseamos éste funcionamiento.
Otro detalle a contar es ¿Cómo se puede establecer el modo de transacciones explícitas (auto commit) o el modo de transacciones implícitas? Por defecto, SQL Server utiliza el modo de transacciones explícitas (auto commit) pudiendo cambiar de un modo a otro modo mediante la sentencia SET IMPLICIT_TRANSACTIONS { ON | OFF }. Del mismo modo, puede resultar de utilidad consultar el valor de la variable de sistema @@TRANCOUNT con el fin de conocer el número de transacciones abiertas por nuestra sesión (ej: si es mayor de 1, es debido a que tenemos transacciones anidadas).

Comentarios

Entradas populares de este blog

¿En qué puerto TCP escucha SQL Server 2005? ¿Cómo cambiar o configurar el puerto TCP de escucha de una Instancia de SQL Server 2005?

Una buena práctica inmediatamente después de instalar SQL Server 2005 es cambiar el Puerto TCP de escucha, por múltiples motivos: Seguridad, Configuración de reglas de acceso de Firewall, Aplicaciones cliente que requieren un puerto TCP estático para SQL Server, etc. En este Artículo se explica cómo averiguar en qué puerto TCP escucha SQL Server 2005, cómo cambiar el puerto TCP de escucha de SQL Server 2005, etc. Resulta de gran interés ser capaz de responder a la pregunta  ¿En qué puerto TCP escucha SQL Server?  Por defecto, una  Instancia por Defecto de SQL Server 2005  queda configurada durante la instalación para escuchar en el  puerto TCP-1433 , sin embargo,  las Instancias con Nombre  quedan configuradas durante el proceso de instalación para escuchar en  puertos TCP dinámicos , por lo tanto, cada vez que se inicie la Instancia puede que escuche en un puerto diferente. Esta situación puede resultar problemática, por un lado desde el punto de vista de la seguridad (el hecho d

¿Qué es el nivel de aislamiento (Isolation Level) de una Transacción? ¿Qué niveles de aislamiento ofrece SQL Server?

Esta capítulo explica qué es el nivel de aislamiento (isolation level) de una transacción, el comportamiento de SQL Server en operaciones de lectura o de escritura, se detallan los diferentes niveles de aislamiento basados en bloqueos (READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE) y los niveles de aislamiento basados en versionado de filas (READ COMMITTED SNAPSHOT, SNAPSHOT), se explican los males de la concurrencia (lecturas sucias, lecturas no repetibles, lecturas fantasma, y conflictos de actualización), como establecer el nivel de aislamiento deseado (SET TRANSACTION ISOLATION LEVEL y las opciones de base de datos READ_COMMITTED_SNAPSHOT y ALLOW_SNAPSHOT_ISOLATION), cómo conecer el tiempo máximo de bloqueo (@@LOCK_TIMEOUT) y como establecer el tiempo máximo de bloqueo (SET LOCK_TIMEOUT), etc. El nivel de aislamiento de una transacción (transaction isolation level)  define el grado en que se aísla una transacción de las modificaciones de recursos o datos rea

Aumentar y Reducir la TempDB en SQL Server?

Una buena práctica después de instalar SQL Server (y que interesa revisar periódicamente) es tener bien dimensionada la base de datos TEMPDB, es decir que el  tamaño inicial de TEMPDB  sea suficiente, y en consecuencia no sea necesario que TEMPDB crezca ni tampoco reducir TEMPDB (SHRINK). Esta artículo explica brevemente  para qué sirve TEMPDB , explica camo cambiar el tamaño inicial de TEMPDB (aumentar o reducir),  cómo reducir TEMPDB , cuántos ficheros son recomendables para TEMPDB, etc. ¿Para qué sirve TEMPDB?  La base de datos TEMPDB es un elemento de gran importancia en una Instancia de SQL Server, ya que  TEMPDB es la encargada de almacenar tanto los objetos temporales  (tablas temporales, procedimientos almacenados temporales, etc.),  como los resultados intermedios  que pueda necesitar crear el motor de base de datos, por ejemplo durante la ejecución de consultas que utilizan las cláusulas GROUP BY, ORDER BY, DISTINCT, etc. (es decir, las tablas temporales o WorkTables que