En InnoDB, no es necesario para iniciar de manera explícita o transacciones finales para consultas individuales si no ha cambiado la configuración predeterminada de confirmación automática, que es "sobre". Si autocommit está activado, InnoDB automáticamente incluye cada consulta SQL en una transacción, que es el equivalente de START TRANSACTION; query; COMMIT;
.
Si utiliza explícitamente START TRANSACTION
en InnoDB con confirmación automática activada, todas las consultas ejecutadas después de una declaración START TRANSACTION
se ejecutarán o todas fallarán. Esto es útil en entornos bancarios, por ejemplo: si estoy transfiriendo $ 500 a su cuenta bancaria, esa operación solo tendrá éxito si la suma se ha restado de mi saldo bancario y se ha agregado al suyo. Así pues, en este caso, que había corrido algo así como
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
este modo se garantiza que, o bien ambas consultas se ejecutarán correctamente, o ninguno, pero no sólo uno. This post tiene más información sobre cuándo debe usar las transacciones.
En InnoDB, muy rara vez tendrá que bloquear tablas completas; InnoDB, a diferencia de MyISAM, admite el bloqueo a nivel de fila. Esto significa que los clientes no tienen que bloquear toda la tabla, lo que obliga a otros clientes a esperar. Los clientes solo deben bloquear las filas que realmente necesitan, permitiendo que otros clientes continúen accediendo a las filas que necesitan.
Puede leer más sobre las transacciones InnoDB here. Sus preguntas sobre el bloqueo se responden en las secciones 14.2.8.8 y 14.2.8.9 de los documentos. Si una consulta falla, su controlador MySQL devolverá un mensaje de error que indica el motivo; su aplicación debería volver a enviar las consultas si es necesario.
Finalmente, en su código de ejemplo, utilizó mysql_query
. Si está escribiendo un código nuevo, deje de usar la antigua, lenta y obsoleta biblioteca mysql_
para PHP y use mysqli_
o PDO en su lugar :)
¿Está utilizando tablas InnoDB o MyISAM? – Daan
@Daan Yo uso InnoDB – weltschmerz