salida procedimientos procedimiento parametros ejercicios ejecutar crear busqueda almacenados almacenado mysql perl stored-procedures dbi autocommit

parametros - procedimientos almacenados mysql



DBI begin_work no funciona con llamadas a procedimientos almacenados (2)

Estoy tratando de realizar una llamada a un procedimiento almacenado desde en una transacción en su forma simplificada:

my $dbh= DBI->connect(............ ); my $sth = $dbh->prepare("call sp_get_workitems (1,1)"); $dbh->begin_work or die $dbh->errstr; $sth->execute(); my ($result)= $sth->fetchrow_array(); $dbh->commit;

esto da el siguiente error:

DBD driver has not implemented the AutoCommit attribute

Si reemplazo la instrucción begin_work con $dbh->{''AutoCommit''} = 0; (antes o después de la preparación), obtengo este error:

DBD::mysql::db commit failed: Commands out of sync; you can''t run this command now

Si reemplazo la llamada de procedimiento almacenado con una instrucción de selección simple, todo funciona bien.

El procedimiento almacenado incluye una serie de actualizaciones y terminaciones con una declaración de selección. Por supuesto, sería más fácil si pudiera manejar la transacción dentro del procedimiento puesto. Necesito aplicar algún código de perl si ocurre la reversión.

Estoy usando ActivePerl en Windows 7 y una instancia de nube de Amazon ejecutando Centos con DBI 1.616 instalado, esto ocurre en ambos.

¿Debería funcionar esto o hay una forma de evitarlo?

Gracias


Asegúrese de finish() explícitamente finish() cada procedimiento preparado ejecutado CALL antes de commit() explícitamente commit() la transacción. P.ej,

$sth->finish; $sth->commit();

Esto parece ser un error para mí, dada la semántica típica de finish() . Múltiples conjuntos de resultados, llamando a more_results , etc. no importaron.

DBD 1.616, DBD :: mysql 4.020 y MySQL 5.5.19.


Si está utilizando AutoCommit => 0, entonces no necesita begin_work (). Todo está en una transacción hasta que commit () o rollback (). Entonces comienza una nueva transacción.

En realidad, debes conectarte con RaiseError => 1, porque deberías obtener un error en begin_work () cuando AutoCommit es 0. De los documentos finos:

Si AutoCommit ya está desactivado cuando se llama a begin_work, no hace nada, excepto devolver un error. Si el controlador no admite transacciones, cuando begin_work intenta desactivar AutoCommit, el controlador generará un error fatal.

Además, ¿qué versión de DBD :: mysql estás usando? Creo que la última versión implementa AutoCommit.