transaction transaccion tran sintaxis example mysql ruby-on-rails activerecord

transaccion - save transaction mysql



Error ActiveRecord: SAVEPOINT active_record_1 no existe (5)

Encontré los siguientes enlaces que me ayudaron:

El error completo es

ActiveRecord::StatementInvalid: Mysql2::Error: SAVEPOINT active_record_1 does not exist: ROLLBACK TO SAVEPOINT active_record_1

Estoy escribiendo una prueba de unidad y obtengo este error cada vez que intento crear un nuevo objeto ActiveRecord, pero solo después de cierto punto. Esto ocurre después de estas líneas:

ActiveRecord::Base.connection.execute "DROP TABLE IF EXISTS foo" ActiveRecord::Base.connection.execute "CREATE TABLE foo (id INTEGER PRIMARY KEY)"

(La tabla ''foo'' se rellenará con datos si mi prueba tiene éxito)

Antes de las líneas anteriores, puedo escribir algo como

User.create(email => ''[email protected]'')

y todo funciona bien. Sin embargo, si intento escribir la línea anterior después de mi llamada a ActiveRecord :: Base.connection.execute, obtengo el error SAVEPOINT descrito anteriormente. También he intentado poner mis sentencias de ejecución dentro de una transacción, pero eso no ayudó. Estoy perplejo.

FYI - Estoy usando Rails 3.2.8


Está utilizando sentencias DDE Mysql (crear / soltar / truncar tabla) que resultarán en una confirmación implícita .

Debido al compromiso implícito, se eliminan todos los puntos de salvaguarda de la transacción actual (consulte la documentación anterior).

Para solucionar esto, puede desactivar las transacciones y usar DatabaseCleaner (modo de truncamiento).


Para resolver este problema ..

config.use_transactional_fixtures = false


Puede utilizar "TEMPORAL" cuando cree / suelte tablas.

http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html ALTER TABLE, CREATE TABLE y DROP TABLE no comprometen una transacción si se usa la palabra clave TEMPORARY. (Esto no se aplica a otras operaciones en tablas temporales como CREATE INDEX, que causan un commit). Sin embargo, aunque no se produce un commit implícito, tampoco se puede revertir la instrucción. Por lo tanto, el uso de dichas declaraciones violará la atomicidad de la transacción: por ejemplo, si utiliza CREAR TABLA TEMPORAL y luego deshace la transacción, la tabla sigue existiendo.


Solo para aclarar. Puede aislar las pruebas que activan las declaraciones DDE de MySql en su propio archivo y luego cram config.use_transactional_fixtures = false en ese archivo. De esta manera todas tus otras pruebas no van a ser afectadas. Ahora usted es responsable de la limpieza en ese archivo de prueba aislado.