Partilhar via


Blocos Atómicos em Procedimentos Nativos

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

BEGIN ATOMIC faz parte do padrão ANSI SQL. O SQL Server suporta blocos atómicos ao nível superior dos procedimentos armazenados nativos, assim como para funções escalares definidas pelo utilizador compiladas nativamente. Para mais informações sobre estas funções, consulte Funções Escalares Definidas pelo Utilizador para In-Memory OLTP.

  • Cada procedimento armazenado compilado nativamente contém exatamente um bloco de instruções Transact-SQL. Isto é um bloco ATÓMICO.

  • Procedimentos armazenados de Transact-SQL interpretados não nativos e lotes ad hoc não suportam blocos atómicos.

Os blocos atómicos são executados (atómicamente) dentro da transação. Ou todas as instruções do bloco são executadas com sucesso, ou todo o bloco será restaurado para o ponto de gravação criado no início do bloco. Além disso, as definições da sessão são fixas para o bloco atómico. Executar o mesmo bloco atómico em sessões com definições diferentes resultará no mesmo comportamento, independentemente das definições da sessão atual.

Transações e Gestão de Erros

Se uma transação já existir numa sessão (porque um lote executou uma instrução BEGIN TRANSACTION e a transação permanece ativa), ao iniciar um bloco atómico será criado um ponto de salvaguarda na transação. Se o bloco for concluído sem exceção, o ponto de gravação criado para o bloco é confirmado, mas a transação só será confirmada quando a transação ao nível da sessão for confirmada. Se o bloco lançar uma exceção, os efeitos do bloco são revertidos, mas a transação ao nível da sessão prosseguirá, a menos que a exceção seja comprometedora para a transação. Por exemplo, um conflito de escrita é fatal para a transação, mas não um erro de conversão de tipos.

Se não houver transação ativa numa sessão, o BEGIN ATOMIC iniciará uma nova transação. Se nenhuma exceção for lançada fora do âmbito do bloco, a transação será confirmada no final do bloco. Se o bloco lançar uma exceção (ou seja, a exceção não for apanhada 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), não é necessário escrever instruções explícitas BEGIN TRANSACTION e COMMIT ou ROLLBACK .

Procedimentos armazenados compilados nativamente suportam as construções TRY, CATCH e THROW para o tratamento de erros. O RAISERROR não é suportado.

O exemplo seguinte ilustra o comportamento de gestão 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 das tabelas otimizadas para memória são que comprometem transações. Se ocorrerem no âmbito de um bloco atómico, causarão o aborto da transação: 10772, 41301, 41302, 41305, 41325, 41332, 41333 e 41839.

Configurações da sessão

As definições de sessão nos blocos atómicos são fixas quando o procedimento armazenado é compilado. Algumas definições podem ser especificadas com BEGIN ATOMIC enquanto outras são sempre fixas ao mesmo valor.

As seguintes opções são necessárias com o BEGIN ATOMIC:

Configuração Obrigatória Description
NÍVEL DE ISOLAMENTO DE TRANSAÇÕES Os valores suportados são SNAPSHOT,REPEATABLEREAD e SERIALIZABLE.
IDIOMA Determina formatos de data e hora e mensagens do sistema. Todas as linguagens e pseudónimos em sys.syslanguages (Transact-SQL) são suportadas.

As seguintes definições são opcionais:

Configuração Opcional Description
DATEFORMAT Todos os formatos de data do SQL Server são suportados. Quando especificado, o DATEFORMAT sobrepõe-se ao formato de data predefinido associado ao LANGUAGE.
DATEFIRST Quando especificado, o DATEFIRST sobrepõe-se ao padrão associado à LANGUAGE.
Durabilidade Atrasada Os valores suportados são DESLIGADOS e LIGADOS.

Os commits de transações do SQL Server podem ser totalmente duráveis, por predefinição, ou com durabilidade adiada. Para mais informações, consulte Controlar a Durabilidade da Transação.

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 ON
ANSI_PADDING ON
ANSI_WARNING ON
ARITHABORT ON
ARITHIGNORE DESLIGADO
CONCAT_NULL_YIELDS_NULL ON
IDENTITY_INSERT DESLIGADO
NOCOUNT ON
NUMERIC_ROUNDABORT DESLIGADO
QUOTED_IDENTIFIER ON
ROWCOUNT 0
TEXTSIZE 0
XACT_ABORT DESLIGADO

Exceções não apanhadas fazem com que o bloco atómico volte atrás, mas não fazem a transação abortar, a menos que o erro seja fatal da transação.

Ver também

Procedimentos Armazenados Compilados Nativamente