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 orders
tabla 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 UNCOMMITTED
nivel 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=1
se 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.