Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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. |