A BEGIN TRAN garante atomicidade?

4

Eu tenho uma situação em que quero inserir registros em uma tabela mestre e de detalhes, mas apenas sob determinadas condições. Então, quando eu insiro, faço algo assim:

set transaction isolation level serializable
BEGIN TRAN

INSERT INTO master (CustomerId, TypeOfTransAction, ...)
SELECT @customerId, 'TEST', ...
WHERE (SELECT SUM(amount) FROM details WHERE customerId = @customerId) < 1000

IF SCOPE_IDENTITY() IS NULL
    RAISERROR('can''t insert now, there''s too many', 16, 1)

INSERT INTO details (CustomerId, ...)
VALUES (@customerId, ...)

INSERT INTO details (CustomerId, ...)
VALUES (@customerId, ...)

...

COMMIT TRAN

Isso garante que nenhuma outra linha será inserida na tabela principal (de outras conexões) até que tenha terminado de inserir todas as linhas na tabela de detalhes?

    
por viking_grll 05.11.2018 / 10:41

1 resposta

2

Você tem algumas perguntas diferentes aqui:

P: O que é atomicidade?

Atomicidade significa que sua transação será completamente bem-sucedida ou falhará completamente. No final de sua transação, quando você executar o comando COMMIT, todo o trabalho deve avançar juntos em uma unidade atômica. Se, por outro lado, você executar o ROLLBACK, todos deverão ser recuperados juntos.

P: A atomicidade significa que uma consulta de inserção bloqueia uma tabela?

Não. A atomicidade é apenas sobre o trabalho envolvido em sua própria transação, não em outros.

P: Se eu quiser impedir que outras pessoas toquem nas mesas enquanto eu trabalho, como faço isso?

Você precisa especificar isso explicitamente como parte de sua consulta, como usando o nível de isolamento SERIALIZABLE. Isso geralmente não é uma boa idéia: é o oposto do alto desempenho. Você quer escrever seu código de uma forma que espere que outras pessoas trabalhem no banco de dados ao mesmo tempo que você.

Esse conceito - por que você deve evitar bloqueios exclusivos / serializáveis em objetos - é muito grande para tentar resolver em uma única resposta.

    
por 05.11.2018 / 14:45

Tags