tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

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

DibiConnection::inTransaction();

před 10 lety

edke
Člen | 198
+
0
-

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 10 lety

phx
Člen | 652
+
0
-

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 10 lety

edke
Člen | 198
+
0
-

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 10 lety

paranoiq
Člen | 388
+
0
-

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 10 lety

phx
Člen | 652
+
0
-

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

před 10 lety

David Grudl
Nette Core | 6790
+
0
-

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 10 lety

edke
Člen | 198
+
0
-

Paraaada, velka vdaka, idem skusat savepointy :)