MySQL a transakce v Nette 2.0.3
- pacaj2am
- Člen | 3
Dobrý den,
chtěl bych se zeptat – mám problémy s transakcemi, chtěl bych, aby se tento kód vykonal v jedné transakci.
Už nevím, jak dál, můžete někdo prosím poradit?
Děkuji
$x = $this->context->params['database'];
$this->db = new Connection($x['dsn'], $x['user'],$x['password']);
foreach($result as $row){
try{
$this->db->beginTransaction();
$this->db->table('table')->insert(array( ... )); //toto se vykoná, i když
$this->db->table('client')->insert(array(...)); //tady to spadne
$this->db->table('table2Archive')->insert($row);
$this->db->table('table2')->where(array('id' => $row->id))->delete();
$this->db->commit();
} catch (Exception $e) {
$this->db->rollback();
Debugger::log($e);
$this->flashMessage('problem...', 'error');
$this->redirect('Error:');
}
}
Jan Pacák
- miler
- Člen | 75
V prvním postu je try/catch sekce v presenteru (beru podle redirectu). Když by ale práce s databází měla být v modelu, jak byste pak pracovali s výjimkami? Měl bych vracet hodnotu po úspěšném commitu, resp. FALSE pokud jsem v catch větvi, nebo to nezachytávat a nechat to až do presenteru? Díky.
- duke
- Člen | 650
Z hlediska čistoty kódu je lepší používat výjimky než při chybě
vracet FALSE. Hlavní výhodou je to, že výjimku si můžeš zachytit až tam,
kde to potřebuješ a ne nutně řešit vrácené FALSE na všech
úrovních.
Pokud by to ale znamenalo příliš časté vyhazování výjimek, může to
být na úkor efektivity kódu (tj. může to zvýšit zátěž serveru). Takže
je třeba zvážit i tento pohled na věc.