Poner una instrucción Select en una transacción

10

¿Cuál es la diferencia entre estas 2 consultas?

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

Y sin transacción:

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

¿Cuál es el efecto de tener SELECTuna transacción interna?

Si DELETE FROM orders WHERE id=1se llamó desde otra sesión justo después de la SELECTen ambos casos, ¿cuándo se procesará?

Songo
fuente

Respuestas:

5

Una consulta SELECT dentro de una transacción, en sí misma, no está protegida adecuadamente de ACTUALIZACIONES y DELETES.

Lo que necesitas para usar lo siguiente:

Si emite Delete From orders Where id=1, sucederá una vez que las filas de la orderstabla hayan liberado sus bloqueos al final de la transacción. Podrías experimentar (en un servidor Dev / Staging, por favor) con el uso del READ UNCOMMITTEDnivel de aislamiento de transacción para hacer que la eliminación ocurra lógicamente, pero solo en commit se hará visible y se grabará permanentemente.

En la segunda transacción, básicamente todas las apuestas están apagadas. Si tu corres

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

correr Delete From orders Where id=1se comprometerá de inmediato. Dependiendo del orden en que MySQL ejecuta estas declaraciones, verá (o no verá) las filas eliminadas.

CONSIDERACIÓN

MySQL 5.6 ahora tiene lo siguiente :

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

Los modificadores READ WRITE y READ ONLY configuran el modo de acceso a la transacción. Permiten o prohíben cambios en las tablas utilizadas en la transacción. La restricción SOLO LECTURA evita que la transacción modifique o bloquee las tablas transaccionales y no transaccionales que son visibles para otras transacciones; la transacción aún puede modificar o bloquear tablas temporales. Estos modificadores están disponibles a partir de MySQL 5.6.5.

RolandoMySQLDBA
fuente