ugrás a tartalomhoz

PDO_MYSQL vs. tárolt eljárás + tranzakciók

tiku I tikaszvince · 2008. Jan. 28. (H), 14.38
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:

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
 
1

Tárolt eljárások => multiple result sets

janoszen · 2008. Jan. 28. (H), 15.33
Üdv,

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:

do
{
 $results[] = $stmt->fetchAll(PDO::FETCH_ASSOC);
} while($stmt->nextRowset());
(K)opirájt, (K)redit: Winston, ő járt utána a témának.

Az emlegetett paramétert nem kell beállítanod, nem segít semmit.

J
2

nem nyert

tiku I tikaszvince · 2008. Jan. 28. (H), 16.52
hát ez sem segített:

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:

$this->_db->beginTransaction();
try {
    $stmt = $this->_db->query( $sql );
    $results = array();
    do {
        $results[] = $stmt->fetchAll(PDO::FETCH_ASSOC);  
    } while($stmt->nextRowset());
    $this->_db->commit();
    $this->_db->closeConnection();
    return  true;
} catch (Exception $e){
    $this->_db->rollBack();
    $this->_db->closeConnection();
    throw $e;
}
Vagy félreértettelek? Kezdem elveszíteni a reményt. Úgy érzem, hogy nem látom a fától az erdőt.
3

Verziók?

janoszen · 2008. Jan. 28. (H), 21.01
Milyen verziókat használsz? Tudsz valami tesztelhető kódot összeállítani (SQL+PHP)? Lehet hogy én néztem ám el valamit, de az elméleti rész minden esetre stimmel.

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:

Unfortunately nextRowset() apparently is not implemented in PHP 5.2.5* -- returns "SQLSTATE[HYC00]: Optional feature not implemented".


Sztem ez válasz a kérdésedre.
6

Re: Update

tiku I tikaszvince · 2008. Jan. 29. (K), 10.39
verzió: PHP 5.2.5 Released [08-Nov-2007] "kezzel forditott, ports-hoz koze nincs, fuggosegek felrakva, hiba nelkul fordult, modositasok nincsennek benne"

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?
7

PDO...

janoszen · 2008. Jan. 29. (K), 13.07
Nem tudom, mit lehetne tenni, várunk amíg a PDO meggyógyul. Vagy elővadászod a régi verzióból a megfelelő forrásfájlt és megpatcheled, valszeg csak pár sorról van szó.
4

eaccelerator

szeber · 2008. Jan. 28. (H), 22.16
Nezz utana, hogy fut-e eaccelerator a szerveren. Annak egy 1-2 honappal ezelotti verziojaban volt egy bug, ami miatt az exception-okat nem tudtad elkapni. Ha fut, kerd meg a rendszergazdat, hogy frissitse (freebsd ports-ban most mar a jo verzio van) vagy php.ini-ben tiltsd le az optimizer-t.

Zsolt
5

Hasonló Windows-on

Medvesajt · 2008. Jan. 29. (K), 01.49
Sziasztok!

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?
8

Fent

janoszen · 2008. Jan. 29. (K), 13.08
Mint írtam fent, PDO bug a PHP 5.2.5-ben.
9

php6

Medvesajt · 2008. Jan. 30. (Sze), 15.39
Egy kolléga kipróbálta php-6.0-ban is ugyanazt a kódot, de a probléma ugyanúgy fennáll.