Vnorene transakcie – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Vnorene transakcie – MySQL – Fórum – Programujte.comVnorene transakcie – MySQL – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Prog.0
Věrný člen
10. 7. 2009   #1
-
0
-

dôvod prečo sa pýtam:

V php mam objekt nad ktorým keď zavolám metódu, vykoná sa transakcia operácií. V prípade prolému sa to celé vrati (rollback) a metóda vyhodí výnimku. Teraz ale potrebujem nad množstvom objektov tejto triedy vyvolať túto metódu, a potrebujem zaručiť, že sa vykonajú všetky, ak nie, chcem všetko vrátiť.

zjednodušený príklad kódu:

class simpleObject

{
public function doSomethingCool()
{
begin
try
{
query
query
query
}
catch()
{
rollback
throw
}
commit
}
}

class listOfSimpleObjects
{
/** @var array An array of {@link simpleObject} objects.
private $list;

public function doSomethingCoolWithAllObjects()
{
begin
try
{
foreach($this->list as $obj) $obj->doSomethingCool();
}
catch ()
{
rollback
throw;
}
commit
}


Nikde na mysql som sa nedočítal o volaní begin za beginom - vnorených transakciách, a asi to ani nepôjde.


Napadlo ma preto riešenie, a chcel by som vedieť vaše názory, prípadne mi prosím navrhnite iné riešenie.
Riešenie spočíva v použití savepointov a "bufferovaní" beginov. Odskúšať už nestíham, no ak s tým má niekto skúsenosti, prípadne to niekoho zaujalo, prosím o názor / skúsenosti.

// počítadlo hĺbky transakcie:

$t_depth = 0;

/**
* Pre zacatie transakcie sa pouzije tato metoda,
* v pripade, ze este nebola zacata transakcia, zabola sa BEGIN
* inak sa zavola savepoint a nazov savepointu bude aktualna hlbka.
*/
function t_begin()
{
if ($t_depth === 0)
{
BEGIN
}
else
SAVEPOINT (++$t_depth);
}

/**
* funkcia pre commit. V pripade ze hlbka transakcii je 1, zavola sa commit, v pripade, ze hlbka je vacsia,
* cislo hlbky sa iba znizi
*/
function t_commit()
{
if ($t_depth === 1)
{
COMMIT
}
$t_depth--;
}

/**
* funkcia pre rollback. V pripade ze hlbka transakcie je 1 zavola sa rollback, v pripade ze hlbka je vacsia
* zavola sa rollback to savepoint kde nazov savepointu na ktory sa vracam je aktualna hlbka
* nakoniec sa hlbka dektrementuje
*/
function t_rollback()
{
if ($t_depth === 1)
{
ROLLBACK
}
else
{
ROLLBACK TO SAVEPOINT $t_depth
}
$t_depth--;
}

Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
Reklama
Reklama
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Podobná vlákna

Vnořené třídy — založil Daewoo

Vnorene stranky??? — založil Matus

Vnorene generika. — založil vitamin

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý