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.
Se aplica a:SQL Server
Azure SQL Database
Azure 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. |