Compartilhar via


Blocos atômicos

BEGIN ATOMIC faz parte do padrão DO SQL ANSI. O 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. Este é um bloco atômico.

  • Procedimentos armazenados não nativos interpretados Transact-SQL e lotes ad hoc não oferecem suporte a blocos atômicos.

Os blocos atômicos são executados (atomicamente) dentro da transação. Todas as instruções no bloco devem ser bem-sucedidas, caso contrário, todo o bloco será revertido para o ponto de restauração que foi criado no início do bloco. Além disso, as configurações de sessão estão fixas para o bloco atômico. Executar o mesmo bloco atômico em sessões com configurações diferentes 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 BEGIN TRANSACTION instrução e a transação permanece ativa), iniciar um bloco atômico criará um ponto de salvamento na transação. Se o bloco for encerrado sem uma exceção, o ponto de salvamento criado para o bloco é confirmado, e a transação não será confirmada até que a transação no nível da sessão seja confirmada. Se o bloco gerar 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 crítica para a transação. Por exemplo, um conflito de gravação pode inviabilizar uma transação, mas não um erro de conversão de tipo.

Se não houver nenhuma 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 final do bloco. Se o bloco gerar uma exceção (ou seja, a exceção não será capturada e tratada dentro do 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 escrever instruções explícitas BEGIN TRANSACTION, COMMIT ou ROLLBACK.

Os procedimentos armazenados compilados nativamente dão suporte às construções TRY, CATCH e THROW para tratamento de erros. Não há suporte para RAISERROR.

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 seguintes mensagens de erro específicas de tabelas otimizadas para memória causam a desqualificação de transações. Se ocorrerem no escopo de um bloco atômico, farão com que a transação seja abortada: 10772, 41301, 41302, 41305, 41325, 41332 e 41333.

Configurações da sessão

As configurações de sessão em blocos atômicos são fixas quando o procedimento armazenado é compilado. Algumas configurações podem ser especificadas com BEGIN ATOMIC, enquanto outras configurações são sempre fixadas com 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 suportados são SNAPSHOT, REPEATABLEREADe SERIALIZABLE.
LANGUAGE Determina formatos de data e hora e 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 Todos os formatos de data do SQL Server têm suporte. 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.

As confirmações de transação do SQL Server podem ser totalmente duráveis, que é a opção padrão, ou duráveis atrasados. Para obter mais informações, consulte Controle de Durabilidade de Transações.

As seguintes opções SET têm o mesmo valor padrão do sistema para todos os blocos atômicos em todos os procedimentos armazenados compilados nativamente:

Definir opção Padrão do Sistema para Blocos Atômicos
ANSI_NULLS LIGADO
ANSI_PADDING LIGADO
ANSI_WARNING LIGADO
ARITHABORT LIGADO
ARITHIGNORE DESLIGADO
CONCAT_NULL_YIELDS_NULL LIGADO
Insere Identidade DESLIGADO
NOCOUNT LIGADO
ARREDONDAMENTO_NUMÉRICO_ABORTAR DESLIGADO
IDENTIFICADOR_COM_COTAS LIGADO
ROWCOUNT 0
Tamanho do Texto 0
XACT_ABORT DESLIGADO

Exceções não capturadas fazem com que o bloco atômico seja revertido, mas não causam o cancelamento da transação, a menos que o erro condene a transação.

Consulte Também

Procedimentos armazenados compilados nativamente