sql >> Base de Datos >  >> RDS >> Mysql

Compromiso y transacción de MySQL

En InnoDB, no necesita iniciar o finalizar transacciones explícitamente para consultas individuales si no ha cambiado la configuración predeterminada de confirmación automática, que está "activada". Si la confirmación automática está activada, InnoDB encierra automáticamente todas las consultas SQL en una transacción, que es el equivalente a START TRANSACTION; query; COMMIT; .

Si usa explícitamente START TRANSACTION en InnoDB con confirmación automática activada, luego cualquier consulta ejecutada después de START TRANSACTION se ejecutarán todas o todas fallarán. Esto es útil en entornos bancarios, por ejemplo:si estoy transfiriendo $ 500 a su cuenta bancaria, esa operación solo debería tener éxito si la suma se restó de mi saldo bancario y se sumó al suyo. Entonces, en este caso, ejecutaría algo como

START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;

Esto garantiza que ambas consultas se ejecutarán correctamente, o ninguna, pero no solo una. Esta publicación tiene más información sobre cuándo debe usar transacciones.

En InnoDB, muy rara vez tendrá que bloquear tablas enteras; InnoDB, a diferencia de MyISAM, admite el bloqueo a nivel de fila. Esto significa que los clientes no tienen que bloquear toda la mesa, obligando a otros clientes a esperar. Los clientes solo deben bloquear las filas que realmente necesitan, lo que permite que otros clientes continúen accediendo a las filas que necesitan.

Puede leer más sobre las transacciones de InnoDB aquí . Sus preguntas sobre interbloqueo 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 indicando el motivo; su aplicación debe volver a emitir las consultas si es necesario.

Finalmente, en su código de ejemplo, usó mysql_query . Si está escribiendo código nuevo, deje de usar el mysql_ antiguo, lento y obsoleto. biblioteca para PHP y use mysqli_ o DOP en su lugar :)