Blocos atômicos
BEGIN ATOMIC
não faz parte do padrão ANSI SQL. SQL Server dá suporte a blocos atômicos somente no nível superior de procedimentos armazenados compilados nativamente.
Cada procedimento armazenado compilado nativamente contém exatamente um bloco de instruções Transact-SQL. Esse é um bloco ATOMIC.
Procedimentos armazenados Transact-SQL não nativos e interpretados e lotes ad hoc não dão suporte a blocos atômicos.
Os blocos atômicos são executados (atomicamente) na transação. Todas as instruções no bloco foram bem-sucedidas ou o bloco inteiro será revertido para o ponto de salvamento criado no início do bloco. Além disso, as configurações da sessão são corrigidas para o bloco atômico. A execução do mesmo bloco atômico nas sessões com diferentes configurações resultará no mesmo comportamento, independentemente das configurações da sessão atual.
Transações e tratamento de erros
Se uma transação já existir em uma sessão (porque um lote executou uma instrução BEGIN TRANSACTION
e a transação permanece ativa), iniciar um bloco atômico criará um ponto de salvamento na transação. Se o bloco sair sem uma exceção, um novo ponto de salvamento criado para o bloco é confirmado, mas a transação não será confirmada até que isso ocorra no nível da sessão. Se o bloco lançar uma exceção, os efeitos do bloco serão revertidos, mas a transação no nível da sessão continuará, a menos que a exceção seja decretada por transação. Por exemplo, um conflito de gravação é decretado por transação, mas não um erro de conversão de tipo.
Se não houver transação ativa em uma sessão, BEGIN ATOMIC
iniciará uma nova transação. Se nenhuma exceção for lançada fora do escopo do bloco, a transação será confirmada no fim do bloco. Se o bloco lançar uma exceção (ou seja, se a exceção não for capturada e tratada no bloco), a transação será revertida. Para transações que abrangem um único bloco atômico (um único procedimento armazenado compilado nativamente), você não precisa gravar instruções BEGIN TRANSACTION
e COMMIT
ou ROLLBACK
explícitas.
Os procedimentos armazenados compilados nativamente oferecem suporte às construções TRY
, CATCH
e THROW
para tratamento de erros. RAISERROR
não é suportado.
O exemplo a seguir ilustra o comportamento de tratamento de erros com blocos atômicos e procedimentos armazenados compilados nativamente:
-- 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
As mensagens de erro a seguir específicas de tabelas com otimização de memória são decretadas por transação. Se elas ocorrerem no escopo de um bloco atômico, a transação será anulada: 10772, 41301, 41302, 41305, 41325, 41332 e 41333.
Configurações da sessão
As configurações da sessão nos blocos atômicos são corrigidas quando o procedimento armazenado é compilado. Algumas configurações podem ser especificadas com BEGIN ATOMIC
, enquanto outras configurações sempre são corrigidas para o mesmo valor.
As seguintes opções são necessárias com BEGIN ATOMIC
:
Configuração necessária | Descrição |
---|---|
TRANSACTION ISOLATION LEVEL |
Os valores com suporte são SNAPSHOT , REPEATABLEREAD e SERIALIZABLE . |
LANGUAGE |
Determina os formatos de data e hora, e as mensagens do sistema. Há suporte para todos os idiomas e aliases em sys.syslanguages (Transact-SQL). |
As seguintes configurações são opcionais:
Configuração opcional | Descrição |
---|---|
DATEFORMAT |
Há suporte para todos os formatos de data SQL Server. Quando especificado, DATEFORMAT substitui o formato de data padrão associado a LANGUAGE . |
DATEFIRST |
Quando especificado, DATEFIRST substitui o padrão associado a LANGUAGE . |
DELAYED_DURABILITY |
Os valores com suporte são OFF e ON .SQL Server confirmações de transação podem ser totalmente duráveis, o padrão ou duráveis atrasados. Para obter mais informações, consulte Controlar durabilidade da transação. |
As opções SET a seguir têm o mesmo valor padrão de sistema para todos os blocos atômicos em todos os procedimentos armazenados compilados nativamente:
Opção Set | Padrão do sistema para blocos atômicos |
---|---|
ANSI_NULLS | ATIVADO |
ANSI_PADDING | ATIVADO |
ANSI_WARNING | ATIVADO |
ARITHABORT | ATIVADO |
ARITHIGNORE | OFF |
CONCAT_NULL_YIELDS_NULL | ATIVADO |
IDENTITY_INSERT | OFF |
NOCOUNT | ATIVADO |
NUMERIC_ROUNDABORT | OFF |
QUOTED_IDENTIFIER | ATIVADO |
ROWCOUNT | 0 |
TEXTSIZE | 0 |
XACT_ABORT | OFF As exceções não capturadas fazem com que o bloco atômico seja revertido, mas não fazem com que a transação seja anulada, a menos que o erro seja decretado por transação. |