php mysql transactions zend-framework2 zend-db

php - ¿Cómo controla Zend / Db en ZF2 las transacciones?



mysql transactions (3)

Hay dos asuntos para hacer la transacción.
1 - MyISAM no es un motor transaccional, por lo tanto, cambie el motor de las tablas a InnoDB.
2 - La conexión de consulta de transacción ( "START TRANSACTION;" OR "ROLLBACK;" ) debe ser igual a la de otras consultas (Insertar o Actualizar).
Para hacer esto en ZF2, debe obtener el adaptador de db actual y utilizarlo en todas las consultas.

Este código no funcionará correctamente:

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); //do some jobs - e.g : multiple tables update or insert. $this->getAdapter()->getDriver()->getConnection()->rollback();

Desde $this->getAdapter()->getDriver()->getConnection() Crea una nueva conexión db.

Utilice el siguiente código en su lugar:

$connection = $this->getAdapter()->getDriver()->getConnection(); $connection->beginTransaction(); //do some jobs - e.g : multiple tables update or insert. $connection->rollback();

Para verificar si sus conexiones son correctas, simplemente habilite el registro de consultas en mysql.
Después de ejecutar la consulta, verá el número de conexión antes de cada consulta en el registro de mysql. Estas deben ser las mismas en todas las consultas de transacciones.

El manual de referencia ZF1 Zend_Db tiene una sección completa sobre cómo realizar transacciones.

El manual de referencia de ZF2 Zend / Db carece de documentación sobre transacciones.

¿Cómo realizo transacciones en ZF2? Código de ejemplo sería útil.


La documentación que falta es curiosa.

Para averiguar qué sucedió, tuve que sumergirme en los documentos API para Zend / Db / Adapter.

Parece que beginTransaction , rollback y commit están definidos en Zend/Db/Adapter/Driver/ConnectionInterface . Esto significa que son métodos invocables en cada conexión de adaptador único. Lamentablemente la conexión en sí está más bien enterrada.

En lo que no estoy claro (y no puedo dar un ejemplo en este momento) es averiguar a qué objeto realmente llamas a estos métodos. En el peor de los casos, parece que es posible que desee llamar a $adapter->getDriver()->getConnection()->beginTransaction() .

Eww.

Espero que alguien con más conocimientos, y una copia de ZF2 a la mano, vea esto y proporcione una mejor opción.

No olvide que solo puede emitir BEGIN TRANSACTION / ROLLBACK / COMMIT / SET autocommit=... instrucciones SQL. Probablemente esté bien, ya que no parece que Zend / Db realice un seguimiento del estado de la transacción.


Tu lo tienes. La forma correcta de iniciar, confirmar y deshacer transacciones es la siguiente:

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); $this->getAdapter()->getDriver()->getConnection()->commit(); $this->getAdapter()->getDriver()->getConnection()->rollback();

Solo para poner esto también puede obtener el último ID creado por:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue()

Si está utilizando pgSQL, deberá agregar la secuencia para devolver el último ID creado:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue(''mail_mailid_seq'')