Hola respondiendo aqui .
¿Como puedo saber si mi BBDD (MySQL) acepta transacciones? ¿Y cómo quedaría la consulta completa finalmente?
Pues simple, las transacciones de registros en una tabla son definidas por el motor de almacenamiento en la cual esta fue creada. MySQL tiene distintos motores de almacenamientos disponibles, ahora por defecto al menos en Linux MySQL se instala utilizando el motor No transaccional MyIsam como motor asignado por defecto al crear una tabla, pero tengo constancia que MySQL para Windows suele instalar utilizando por defecto el motor Transaccional InnoDB.
Ahora que es un motor transaccional y que es un motor no transaccional. Un motor no transaccional (En este caso me referire a Myisam) es aquel en el cual cualquier cambio de los registros dentro de una tabla (Ya sea Insertar, borrar, actualizar datos) son automaticamente aplicados asap! sin permitirte regresar atras o recuperar alguna data sin querer perdida... todo es aplicado instantaneamente.
Un motor de almacenamiento Transaccional (En este caso usare de ejemplo InnoDB) es aquel en el cual cualquier cambio de los registros dentro de una tabla (Ya sea insertar, actualizar, borrar datos) no son instantaneamente aplicados a la tabla... sino que la consulta se ingresa a los registros de la tabla pero se queda en memoria en espera de una peticion de parte del usuario ya sea COMMIT (Aplicar cambios) o ROLLBACK (Retroceder a como estaba anteriormente) suponte que se guarda un backup del registro que tenias anteriormente, y sin querer eliminas 20 registros con la sentencia DELETE .... si tus tablas estan en un motor Transaccional tipo InnoDB puedes seguido del error que cometiste con DELETE.. realizar un ROLLBACK y la tabla regresara al ultimo registro existente antes de la consulta DELETE que realizaste. Esta ventaja NO existe en motores No transaccionales (Puedes probar).
Para habilitar y desabilitar las transacciones en MySQL no basta con que digas que tu tabla es InnoDB tienes que activar la variable encargada de ello tambien :
mysql> set autocommit = 0;
con el autocommit desabilitado, podras sacarle ventaja a Rollback y Commit en tus tablas Transaccionales. La ventajas de las transacciones es esa... que puedes o aplicar los cambios o retroceder al ultimo registro disponible... pero OJO. Si haces esto :
mysql> delete from tabla1 where nombres = 'pepe';
20 rows delete...
mysql> select * from tabla1;
bla bla bla....
mysql> rollback;
No volveras a obtener el registro 'pepe' ya que Rollback retrocede al ultimo registro aplicado antes de la consulta SQL realizada... no se si me explico.
Para tener desactivado el autocommit por defecto siempre, modifica tu archivo my.ini (Si es Windows) o my.cnf *Si es Linux* y agrega en alguna parte :
autocommit = 0;
Sobre tu error de MySQL y PHP no me aclaro pero... te doy un consejo, comenta todas las consultas SQL que tienes ahi excepto la primera y ve probando una por una comentando y descomentando... para enterarte cual de todas es la que esta dando problemas con la consulta y asi poder ayudarte mejor.
Por cierto ON y WHERE es lo mismo en el caso que lo estas aplicando... puedes obviar el WHERE.