Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Qual é o objetivo de incluir instruções select em uma transação?


Você está certo:no padrão nível de isolamento , read committed , você não precisa agrupar instruções select nas transações. As instruções Select serão protegidas contra leituras sujas, quer você as envolva em uma transação ou não.
connection 1:                          connection 2:

                                       begin transaction
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1
                                       rollback transaction

A instrução select não lerá a atualização revertida:não importa que eles não estejam envolvidos em uma transação.

Se você precisar de leituras repetíveis , agrupar seleções em uma transação padrão não ajuda:
connection 1:                          connection 2:

begin transaction
select name from users where id = 1
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1
commit transaction

O begin e commit instruções não ajudarão aqui:o segundo select pode leia o nome antigo ou pode leia o novo nome.

No entanto, se você executar em um nível de isolamento mais alto, como serializable ou repeatable read , o grupo estará protegido contra leituras não repetíveis:
connection 1:                          connection 2:

set transaction isolation level
    repeatable read
begin transaction
select name from users where id = 1
                                       update user set name = 'Bill' where id = 1
select name from users where id = 1              |
commit transaction                               |
                                                 |--> executed here

Nesse cenário, a update bloqueará até que a primeira transação seja concluída.

Níveis de isolamento mais altos raramente são usados ​​porque diminuem o número de pessoas que podem trabalhar no banco de dados ao mesmo tempo. No nível mais alto, serializable , uma consulta de relatório interrompe qualquer atividade de atualização.