Bloques ATOMIC 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 ATOMIC en el nivel superior de los procedimientos almacenados compilados de forma nativa, así como en las funciones escalares definidas por el usuario y 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 los bloques atomic.

Los bloques atomic se ejecutan (atómicamente) dentro de la transacción. Todas las instrucciones del bloque se ejecutan correctamente o el bloque completo se revertirá al punto de retorno que se creó al principio del bloque. Además, los parámetros de configuración de la sesión son fijos para el bloque atomic. La ejecución del mismo bloque atomic en sesiones con diferentes parámetros producirá el mismo comportamiento, independientemente de la configuración de la sesión actual.

Transacciones y control de errores

Si una transacción ya existe en una sesión (porque un lote ejecutó una instrucción BEGIN TRANSACTION y la transacción permanece activa), el inicio a continuación de un bloque ATOMIC creará un punto de retorno en la transacción. Si el bloque sale sin una excepción, se confirma el punto de retorno que se creó para el bloque, pero la transacción no se confirmará hasta que se confirme en el nivel de sesión. Si el bloque produce una excepción, los efectos del bloque se revierten pero la transacción en el nivel de sesión continuará, a menos que la excepción invalide la transacción. Por ejemplo, un conflicto de escritura invalida la transacción, mientras que un error de conversión no la invalida.

Si no hay ninguna transacción activa en una sesión, BEGIN ATOMIC iniciará una nueva transacción. Si no se inicia una 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 ni se controla en el bloque), la transacción se revertirá. Para las transacciones que ocupan un único bloque ATOMIC (un solo procedimiento almacenado compilado de forma nativa), no se deben escribir instrucciones BEGIN TRANSACTION y COMMIT o ROLLBACK explícitas.

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

En el ejemplo siguiente se muestra el comportamiento de control de errores con bloques atomic 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 aparecen en el ámbito de un bloque atomic, provocan la anulación de las transacciones: 10772, 41301, 41302, 41305, 41325, 41332, 41333 y 41839.

Configuración de la sesión

Los parámetros de configuración de sesión de los bloques atomic son fijos 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 reemplaza el formato de fecha predeterminado asociado a LANGUAGE.
DATEFIRST Cuando se especifica, DATEFIRST reemplaza el valor predeterminado asociado a LANGUAGE.
DELAYED_DURABILITY Los valores admitidos son OFF y ON.

Las confirmaciones de transacción pueden ser totalmente durables (el valor predeterminado) o durables diferidas. Para obtener más información, vea Controlar la durabilidad de las transacciones.

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

Opción SET Valor predeterminado del sistema para los bloques atomic
ANSI_NULLS ON
ANSI_PADDING ON
ANSI_WARNING ON
ARITHABORT ON
ARITHIGNORE Apagado
CONCAT_NULL_YIELDS_NULL ON
IDENTITY_INSERT Apagado
NOCOUNT ON
NUMERIC_ROUNDABORT Apagado
QUOTED_IDENTIFIER ON
ROWCOUNT 0
TEXTSIZE 0
XACT_ABORT Apagado

Las excepciones no detectadas hacen que se revierta el bloque atomic, pero no causan que la transacción se anule a menos que el error invalide la transacción.

Consulte también

Procedimientos almacenados compilados de forma nativa