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.