PDO_MYSQL vs. tárolt eljárás + tranzakciók
Sziasztok!
ZendFramework-ből (v1.0.3) szeretnék egy MySQL(v5.0) tárolt eljárást meghívni tranzakción belül. Ha az eljárással van valami bibi, akkor rollback-elnék. Linuxon fejlesztek, a teszt szerveren BSD fut. Nálam minden gyönyörűen működik, a BSD szerveren viszont mindig eldobja magát:
Természetesen az első lépés az volt, hogy a hibaüzenetben említett attribútumot a javasolt értékre állítottam, nem használt. Próbáltam a hívás módján változtatni, direkt összeállítani az SQL sztringet, Keretrendszerrel összeállíttatni, de mindig a fenti végeredménybe futok bele.
Gondoltam arra, hogy a tranzakciót még a try ágba lépés előtt indítom; mondanom sem kell hogy ez az ötletem sem jött be.
MySQL 5-ben tárolt eljárásokon belül nem lehet tranzakciózni, szóval ez sem járható út.
Valakinek sikerült már ezt a dolgot összehozni?
VinceVoltam
■ ZendFramework-ből (v1.0.3) szeretnék egy MySQL(v5.0) tárolt eljárást meghívni tranzakción belül. Ha az eljárással van valami bibi, akkor rollback-elnék. Linuxon fejlesztek, a teszt szerveren BSD fut. Nálam minden gyönyörűen működik, a BSD szerveren viszont mindig eldobja magát:
try{
$db->beginTransaction();
$db->prepare( "call eljarasom( 'a', 'b', '123' )" )->execute();
$db->commit();
}catch(Exception $e) {
$db->rollBack();
}
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.' in /www/octopus.kv/Zend/Db/Adapter/Pdo/Abstract.php:254
Természetesen az első lépés az volt, hogy a hibaüzenetben említett attribútumot a javasolt értékre állítottam, nem használt. Próbáltam a hívás módján változtatni, direkt összeállítani az SQL sztringet, Keretrendszerrel összeállíttatni, de mindig a fenti végeredménybe futok bele.
Gondoltam arra, hogy a tranzakciót még a try ágba lépés előtt indítom; mondanom sem kell hogy ez az ötletem sem jött be.
MySQL 5-ben tárolt eljárásokon belül nem lehet tranzakciózni, szóval ez sem járható út.
Valakinek sikerült már ezt a dolgot összehozni?
VinceVoltam
Tárolt eljárások => multiple result sets
MySQL-ben a tárolt eljárások több result settel térnek vissza, amelyek közül mindegyiket kell lekérned, különben a MySQL kliens és a szerver kiesnek a szinkronból. (Ezért nem is tudod sima MySQL extension-nel használni őket PHP-ből.)
Mint a hibaüzenet is javasolta, használd a fetchAll metódust, hogy visszakapd az összes result set-et, az megoldja a problémát, kb. így:
Az emlegetett paramétert nem kell beállítanod, nem segít semmit.
J
nem nyert
Fatal error: Uncaught exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[HYC00]: Optional feature not implemented' in /www/<project>/Zend/Db/Statement/Pdo.php:364 Stack trace: #0 /www/<project>/app/models/<Model>.php(440): Zend_Db_Statement_Pdo->nextRowset() #1 ...
Most itt áll a kódom:
Verziók?
Update: Próbáld meg a commitot előbb lefuttatni, mint ahogy lekéred az eredményeket. Az mit csinál?
Update 2: A commentek között volt egy ilyen:
Sztem ez válasz a kérdésedre.
Re: Update
Fatal error: Uncaught exception 'PDOException' with message 'There is no active transaction' in /www/<project>/Zend/Db/Adapter/Pdo/Abstract.php:254 Stack trace: #0 /www/<project>/Zend/Db/Adapter/Pdo/Abstract.php(254): PDO->rollBack() #1 /www/<project>/Zend/Db/Adapter/Abstract.php(440): Zend_Db_Adapter_Pdo_Abstract->_rollBack() #2...
Akkor ez azt jelenti, hogy várjuk meg a következő PHP kiadást? vagy downgradeljünk? Egyiket sem tartom egy nyerő ötletnek.
Egyébként ez vajon hogy lehetséges, hogy egy funkció, nem működik sem Windowsos, sem a BSD kiadásokon?
PDO...
eaccelerator
Zsolt
Hasonló Windows-on
Megemlíteném, hogy nekem is előfordul az említett unbuffered_query hiba, de érdekes módon csak windows-on, Linuxon nem. Nekem se segített MYSQL_ATTR_USE_BUFFERED_QUERY, hiába toltam be példányosításkor, és a prepare()-nek.
Eléggé sok fejlesztőnek volt már ezzel gondja, teli van velük a net, viszont megoldást sehol nem találtam. Sejti valaki, hogy miért van ez csak windows-on?
Fent
php6