Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
BEGIN ATOMIC forma parte del estándar ANSI SQL. SQL Server solo admite bloques atómicos en el nivel superior de procedimientos almacenados compilados de forma nativa.
Cada procedimiento almacenado compilado de forma nativa contiene exactamente un bloque de instrucciones Transact-SQL. Se trata de un bloque ATOMIC.
Los procedimientos almacenados Transact-SQL interpretados no nativos y los lotes ad hoc no admiten bloques atómicos.
Los bloques atómicos se ejecutan (de forma atómica) dentro de la transacción. O bien todas las instrucciones del bloque se ejecutan correctamente o todo el bloque se revertirá al punto de guardado que se creó al principio del bloque. Además, la configuración de la sesión está fijada para el bloque atómico. La ejecución del mismo bloque atómico en sesiones con diferentes configuraciones dará como resultado el mismo comportamiento, independientemente de la configuración de la sesión actual.
Transacciones y control de errores
Si ya existe una transacción en una sesión (porque un lote ejecutó una BEGIN TRANSACTION instrucción y la transacción permanece activa), al iniciar un bloque atómico, se creará un punto de salvaguarda en la transacción. Si el bloque termina sin una excepción, el punto de guardado creado para el bloque se confirma, pero la transacción no se confirmará hasta que la transacción a nivel de sesión se confirme. Si el bloque produce una excepción, los efectos del bloque se deshacen, pero la transacción en el nivel de sesión continuará, a menos que la excepción sea crítica para la transacción. Por ejemplo, un conflicto de escritura es crítico para las transacciones, mientras que un error de conversión de tipos no lo es.
Si no hay ninguna transacción activa en una sesión, BEGIN ATOMIC iniciará una nueva transacción. Si no se produce ninguna excepción fuera del ámbito del bloque, la transacción se confirmará al final del bloque. Si el bloque produce una excepción (es decir, la excepción no se detecta y se controla dentro del bloque), la transacción se revertirá. En el caso de las transacciones que abarcan un único bloque atómico (un único procedimiento almacenado compilado de forma nativa), no es necesario escribir instrucciones explícitas BEGIN TRANSACTION, COMMIT o ROLLBACK.
Los procedimientos almacenados compilados de forma nativa admiten las construcciones TRY, CATCH y THROW para el control de errores. No se admite RAISERROR.
En el ejemplo siguiente se muestra el comportamiento de control de errores con bloques atómicos y procedimientos almacenados compilados de forma nativa:
-- sample table
CREATE TABLE dbo.t1 (
c1 int not null primary key nonclustered
)
WITH (MEMORY_OPTIMIZED=ON)
GO
-- sample proc that inserts 2 rows
CREATE PROCEDURE dbo.usp_t1 @v1 bigint not null, @v2 bigint not null
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS
BEGIN ATOMIC
WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english', DELAYED_DURABILITY = ON)
INSERT dbo.t1 VALUES (@v1)
INSERT dbo.t1 VALUES (@v2)
END
GO
-- insert two rows
EXEC dbo.usp_t1 1, 2
GO
-- verify we have no active transaction
SELECT @@TRANCOUNT
GO
-- verify the rows 1 and 2 were committed
SELECT c1 FROM dbo.t1
GO
-- execute proc with arithmetic overflow
EXEC dbo.usp_t1 3, 4444444444444
GO
-- expected error message:
-- Msg 8115, Level 16, State 0, Procedure usp_t1
-- Arithmetic overflow error converting bigint to data type int.
-- verify we have no active transaction
SELECT @@TRANCOUNT
GO
-- verify rows 3 was not committed; usp_t1 has been rolled back
SELECT c1 FROM dbo.t1
GO
-- start a new transaction
BEGIN TRANSACTION
-- insert rows 3 and 4
EXEC dbo.usp_t1 3, 4
-- verify there is still an active transaction
SELECT @@TRANCOUNT
-- verify the rows 3 and 4 were inserted
SELECT c1 FROM dbo.t1 WITH (SNAPSHOT)
ORDER BY c1
-- catch the arithmetic overflow error
BEGIN TRY
EXEC dbo.usp_t1 5, 4444444444444
END TRY
BEGIN CATCH
PRINT N'Error occurred: ' + error_message()
END CATCH
-- verify there is still an active transaction
SELECT @@TRANCOUNT
-- verify rows 3 and 4 are still in the table, and row 5 has not been inserted
SELECT c1 FROM dbo.t1 WITH (SNAPSHOT)
ORDER BY c1
COMMIT
GO
-- verify we have no active transaction
SELECT @@TRANCOUNT
GO
-- verify rows 3 and 4 has been committed
SELECT c1 FROM dbo.t1
ORDER BY c1
GO
Los siguientes mensajes de error que son específicos para las tablas optimizadas para memoria provocan que las transacciones fracasen. Si se producen en el alcance de un bloque atómico, harán que la transacción aborte: 10772, 41301, 41302, 41305, 41325, 41332 y 41333.
Configuración de la sesión
La configuración de la sesión en los bloques atómicos se establece cuando se compila el procedimiento almacenado. Algunas opciones de configuración se pueden especificar con BEGIN ATOMIC , mientras que otras configuraciones siempre se fijan en el mismo valor.
Las siguientes opciones son necesarias con BEGIN ATOMIC:
| Configuración necesaria | Descripción |
|---|---|
TRANSACTION ISOLATION LEVEL |
Los valores admitidos son SNAPSHOT, REPEATABLEREADy SERIALIZABLE. |
LANGUAGE |
Determina los formatos de fecha y hora y los mensajes del sistema. Se admiten todos los lenguajes y alias de sys.syslanguages (Transact-SQL). |
La siguiente configuración es opcional:
| Configuración opcional | Descripción |
|---|---|
DATEFORMAT |
Se admiten todos los formatos de fecha de SQL Server. Cuando se especifica, DATEFORMAT invalida el formato de fecha predeterminado asociado a LANGUAGE. |
DATEFIRST |
Cuando se especifica, DATEFIRST invalida el valor predeterminado asociado a LANGUAGE. |
DELAYED_DURABILITY |
Los valores admitidos son OFF y ON.Las confirmaciones de transacciones de SQL Server pueden ser totalmente duraderas, predeterminadas o diferidas. Para obtener más información, vea Controlar la durabilidad de las transacciones. |
Las siguientes opciones SET tienen el mismo valor predeterminado del sistema para todos los bloques atómicos en todos los procedimientos almacenados compilados de forma nativa:
| Establecer opción | Valor predeterminado del sistema para bloques atómicos |
|---|---|
| ANSI_NULLS | EN |
| ANSI_PADDING | EN |
| ANSI_WARNING | EN |
| ARITHABORT | EN |
| ARITHIGNORE | Apagado |
| CONCAT_NULL_YIELDS_NULL | EN |
| IDENTITY_INSERT | Apagado |
| NOCOUNT | EN |
| NUMERIC_ROUNDABORT | Apagado |
| QUOTED_IDENTIFIER (identificador entre comillas) | EN |
| ROWCOUNT | 0 |
| TAMAÑO DE TEXTO | 0 |
| XACT_ABORT | Apagado Las excepciones no detectadas hacen que el bloque atómico se revierta, pero no hagan que la transacción aborte a menos que el error sea un error que condene la transacción. |