tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

DibiConnection::inTransaction();

před 11 lety

edke
Člen | 198

Ahoj David.

Je v dibi implentovany sposob, ako by som mohol overit, ci som/nie som v transakcii ? Private premenna existuje, ale nenasiel som metodu, ktorou by sa dala overit. Zislo by sa nieco taketo:

/**
* Is in transaction ? (if supported).
* @return boolean
*/

public function inTransaction()
{
    return $this->inTxn;
}

Aj ked je pravda, ze v mojej aktualnej situacii si vystacim s tymto:

final public function disconnect()
{
    if ($this->connected) {
        if ($this->inTxn) {
            $this->rollback();
        }
        $this->driver->disconnect();
        $this->connected = FALSE;
    }
}

před 11 lety

phx
Člen | 652

Ja to osetruji pres vyjimku. Dam dibi::begin() a but to projde nebo vyjimka mi rekne ze mam smulu. Bohuzel pak zase musim rucne osetrovat zda skoncit kdyz jsem zacal nebo neskoncit kdyz jsem nezacal (nepovedlo se zacit).

Proc to potrebuji. Mam na praci s DB napsane ruzne metody a nektere pouzivaji trancakci, ale problem (u MYSQL) je kdyz metoda s transakci pouziva metodu s transakci. Osobne bych spise uvital aby si dibi pamatovalo kolikrat jsem volal dibi::begin() a kdyz zavolam dibi::commit() tak aby to commitlo pouze kdyz pocet begin a commit bude stejny. (jakoby vnozovani a vynorovani). Rollback by to cele zabil at jsem vnoren jakkoliv hluboko. I kdyz to je otazka co by mel delat rollback.

Hm?

před 11 lety

edke
Člen | 198

phx wrote:

Ja to osetruji pres vyjimku. Dam dibi::begin() a but to projde nebo vyjimka mi rekne ze mam smulu. Bohuzel pak zase musim rucne osetrovat zda skoncit kdyz jsem zacal nebo neskoncit kdyz jsem nezacal (nepovedlo se zacit).

Hej, to ma napadlo, ale potom som prisiel nato, ze disconnect riesi rollback() a to mi v tejto situacii staci, teda som sa k takejto malej „prasarne“ zatial vyhol :)

před 11 lety

paranoiq
Člen | 388

phx napsal(a):

Osobne bych spise uvital aby si dibi pamatovalo kolikrat jsem volal dibi::begin() a kdyz zavolam dibi::commit() tak aby to commitlo pouze kdyz pocet begin a commit bude stejny. (jakoby vnozovani a vynorovani).

jen takový nápad:
vnořování transakcí by se dalo implementovat pomocí savepointů (alespoň v mysql a pg určitě). dibi by si muselo pamatovat v jaké úrovni zanoření právě je a podle toho potvrzovat a stornovat savepointy.

před 11 lety

phx
Člen | 652

Savepointy? to si budu muset nastudovat;) Diky za tip.

před 11 lety

David Grudl
Nette Core | 6806

Přidal jsem podporu pro savepointy (a metodu inTransaction). Snad to bude fungovat. Používají se existující metody begin(), commit() a rollback(), které mají nyní jako volitelný parametr název savepoint.

před 11 lety

edke
Člen | 198

Paraaada, velka vdaka, idem skusat savepointy :)