Bloques atómicos en procedimientos nativos

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

BEGIN ATOMIC es parte del estándar ANSI SQL. SQL Server admite bloques atómicos en el nivel superior de los procedimientos almacenados compilados de forma nativa, así como en las funciones escalares definidas por el usuario compiladas de forma nativa. Para obtener más información sobre estas funciones, vea Funciones escalares definidas por el usuario para OLTP en memoria.

  • Cada procedimiento almacenado compilado de forma nativa contiene exactamente un bloque de instrucciones de Transact-SQL. Este es un bloque ATOMIC.

  • Los procedimientos almacenados de Transact-SQL interpretados no nativos y los lotes ad hoc no admiten bloques atómicos.

Los bloques atómicos se ejecutan (atómicamente) dentro de la transacción. O bien todas las sentencias del bloque se ejecutan correctamente, o bien el bloque completo se revertirá al punto de guardado que se creó al inicio del bloque. Además, los ajustes de la sesión están fijados para el bloque atómico. La ejecución del mismo bloque atómico en sesiones con distinta configuración dará lugar al 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 instrucción BEGIN TRANSACTION y la transacción sigue activa), al iniciar un bloque atómico se creará un punto de guardado en la transacción. Si el bloque finaliza sin ninguna excepción, se confirma el punto de guardado que se creó para el bloque, pero la transacción no se confirmará hasta que se confirme la transacción del nivel de sesión. Si el bloque genera una excepción, los efectos del bloque se deshacen, pero la transacción a nivel de sesión continuará, a menos que la excepción haga inviable la transacción. Por ejemplo, un conflicto de escritura invalida la transacción, mientras que un error de conversión de tipo no la invalida.

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 al salir 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 ni se controla en el bloque), la transacción se revertirá. Para 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 y COMMIT o ROLLBACK.

Los procedimientos almacenados compilados de forma nativa admiten las construcciones TRY, CATCHy THROW para el control de errores. No se admiteRAISERROR .

El siguiente ejemplo ilustra el comportamiento del manejo 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 mensajes de error siguientes específicos de las tablas optimizadas para memoria invalidan las transacciones. Si se producen en el ámbito de un bloque atómico, harán que la transacción se anule: 10772, 41301, 41302, 41305, 41325, 41332, 41333 y 41839.

Configuración de la sesión

Las opciones de configuración de la sesión en los bloques atómicos quedan fijadas cuando se compila el procedimiento almacenado. Algunos parámetros se pueden especificar con BEGIN ATOMIC , mientras que otros están fijos siempre en el mismo valor.

Se requieren las siguientes opciones 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).

Los siguientes parámetros de configuración son opcionales:

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 de durabilidad completa, que es la opción predeterminada, o de durabilidad diferida. Para obtener más información, vea Controlar la durabilidad de las transacciones.

Las siguientes SET opciones tienen el mismo valor predeterminado del sistema para todos los bloques atómicos en todos los procedimientos almacenados compilados de forma nativa:

Configurar opción Valor predeterminado del sistema para los bloques atómicos
ANSI_NULLS ENCENDIDO
ANSI_PADDING ENCENDIDO
ANSI_WARNING ENCENDIDO
ARITHABORT ENCENDIDO
ARITHIGNORE Apagado
CONCAT_NULL_YIELDS_NULL ENCENDIDO
IDENTITY_INSERT Apagado
NOCOUNT ENCENDIDO
NUMERIC_ROUNDABORT Apagado
QUOTED_IDENTIFIER ENCENDIDO
ROWCOUNT 0
TEXTSIZE 0
XACT_ABORT Apagado

Las excepciones no detectadas provocan la reversión del bloque atómico, pero no hacen que la transacción se aborte, salvo que el error deje la transacción en un estado irrecuperable.

Consulte también

Procedimientos almacenados compilados de forma nativa