Colocando uma instrução Select em uma transação

10

Qual é a diferença entre essas 2 consultas:

START TRANSACTION;
SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;
COMMIT;

E sem transação:

SELECT * FROM orders WHERE id=1;
UPDATE orders SET username='John' WHERE id=1;  

Qual é o efeito de ter SELECTuma transação interna?

Se DELETE FROM orders WHERE id=1foi chamado de outra sessão logo após o, SELECTnos dois casos, quando será processado?

Songo
fonte

Respostas:

5

Uma consulta SELECT dentro de uma transação, por si só, não é protegida adequadamente contra UPDATEs e DELETEs.

O que você precisa para usar o seguinte:

Se você emitir Delete From orders Where id=1, isso acontecerá assim que as linhas da orderstabela liberarem seus bloqueios no final da transação. Você pode experimentar (em um Servidor de Desenvolvimento / Staging, por favor) o uso do READ UNCOMMITTEDnível de isolamento de transação para fazer com que a exclusão ocorra logicamente, mas somente na confirmação ela ficará visível e gravada permanentemente.

Na segunda transação, basicamente todas as apostas estão desativadas. Se você correr

select * From orders Where id=1;
UPDATE orders SET username="John" Where id=1;

A execução Delete From orders Where id=1será confirmada imediatamente. Dependendo da ordem em que o MySQL executa essas instruções, você verá (ou não verá) as linhas de exclusão.

EMBARGO

O MySQL 5.6 agora possui o seguinte :

  • START TRANSACTION READ WRITE;
  • START TRANSACTION READ ONLY;

Os modificadores READ WRITE e READ ONLY definem o modo de acesso à transação. Eles permitem ou proíbem alterações nas tabelas usadas na transação. A restrição READ ONLY impede que a transação modifique ou bloqueie as tabelas transacionais e não transacionais que são visíveis para outras transações; a transação ainda pode modificar ou bloquear tabelas temporárias. Esses modificadores estão disponíveis no MySQL 5.6.5.

RolandoMySQLDBA
fonte