Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instâ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. |