Tengo una pregunta con respecto a mysql compromete y transacciones.

Tengo un par de php instrucciones que se ejecutan las consultas de mysql.

Sólo debo decir lo siguiente?

mysql_query("START TRANSACTION");
//more queries here
mysql_query("COMMIT");

¿Qué sería exactamente con esto? ¿Cómo ayudar? Para actualizaciones, eliminaciones e inserciones también encontré esto para bloquear otras consultas de lectura:

mysql_query("LOCK TABLES t1 WRITE, t2 WRITE");
//more queries here
mysql_query("UNLOCK TABLES t1, t2");

Sería este bloque de otras consultas de cualquier naturaleza o sólo escribe/selecciona?

Otra pregunta: Dicen que una consulta se ejecuta y bloques de otras consultas. Otra consulta intenta bloqueado el acceso a datos y se ve que está bloqueado. ¿Cómo proceder? Qué esperar hasta que los datos se desbloquea de nuevo y volver a ejecutar la consulta? Simplemente tiene que fallar y debe ser repetida? Si es así, ¿cómo puedo comprobar?

Muchas gracias!

Dennis

  • Está usted usando InnoDB o tablas MyISAM?
  • Puedo usar InnoDB
InformationsquelleAutor dchacke | 2012-05-14

1 Comentario

  1. 14

    En InnoDB, no necesitan explícitamente inicio o final de las transacciones para las consultas únicas si no ha cambiado la configuración predeterminada de autocommit, que es «en». Si autocommit está en, InnoDB automáticamente encierra cada consulta SQL en una transacción, que es el equivalente de START TRANSACTION; query; COMMIT;.

    Si explícitamente el uso de START TRANSACTION en InnoDB con autocommit, entonces cualquiera de las consultas ejecutadas después de un START TRANSACTION declaración de bien de todo ser ejecutado, o todos ellos fallará. Esto es útil en entornos de banca, por ejemplo: si yo soy la transferencia de $500 en su cuenta bancaria, que la operación debe tener éxito sólo si la suma ha sido sustraída de mi saldo bancario y se añade a la suya. Así que en este caso, tendría que ejecutar 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 cualquiera de ambas consultas se ejecutan correctamente, o ninguno, pero no sólo uno.
    Este post tiene un poco más acerca de cuándo se debe utilizar transacciones.

    En InnoDB, que muy rara vez tienen que bloquear tablas enteras; InnoDB, a diferencia de MyISAM, admite el bloqueo de fila. Esto significa que los clientes no tienen que bloquear toda la tabla, obligando a otros clientes a esperar. Los clientes sólo deben bloquear las filas que realmente necesitan, lo que permite que otros clientes para seguir accediendo a las filas que necesitan.

    Usted puede leer más acerca de InnoDB transacciones aquí. Sus preguntas acerca de los interbloqueos son respondidas en las secciones 14.2.8.8 y 14.2.8.9 de la documentación. Si la consulta falla, su driver de MySQL, se devolverá un mensaje de error indicando el motivo, su aplicación debe volver a enviar las consultas, si es necesario.

    Finalmente, en el ejemplo de código, se utiliza mysql_query. Si usted está escribiendo código nuevo, por favor, deje de usar el viejo, lento y obsoleto mysql_ librería para PHP y el uso mysqli_ o PDO lugar 🙂

    • impresionante, gracias! lo hace InnoDB automáticamente sólo bloquear filas? Y ¿cómo puedo comprobar si mi tabla tiene auto commit en? y ¿cómo puedo establecer un índice en ella (estoy usando phpmyadmin)
    • Usted puede emitir un SHOW VARIABLES LIKE 'autocommit' consulta, o haga clic en variables en la página de inicio de phpMyAdmin. La creación de un índice se hace yendo a la appropriat de la base de datos y tabla, haga clic structure y utilizando el formulario que usted puede ver que hay para crear un índice. O puede emitir sentencias SQL, por ejemplo,ALTER TABLE table ADD INDEX (field). No estoy seguro de lo que quieres decir con «no InnoBD automáticamente sólo bloquear filas» – que sin duda nunca se bloquee automáticamente una tabla completa, si es eso a lo que te refieres 🙂
    • Autocommit está en 🙂 ¿las claves primarias siempre servir como un índice? Tengo las claves primarias de las tablas y quería añadir un índice, pero dijo que sólo podía ser el mismo que el de la clave principal…
    • Sí, las claves primarias servir como un índice 🙂
    • está bien, eso hace que sea aún más fácil 🙂 muchas gracias!!
    • Desde documentación de MySQL: Para desactivar el modo de confirmación automática implícitamente para una sola serie de declaraciones, utilice el INICIO de la TRANSACCIÓN la declaración. Con el INICIO de la TRANSACCIÓN, autocommit permanece desactivado hasta que finalice la transacción con COMMIT o ROLLBACK. El modo de confirmación automática, a continuación, vuelve a su estado anterior.

Dejar respuesta

Please enter your comment!
Please enter your name here