Autor Zpráva
MarkOh89898
Profil *
Ahoj,

neviete jak to funguje?:)

  trans = db.getTransaction()
  
  except MySQLdb.Error, (code, msg):
            return { " padne" }
    
   trans.commit()

chcem sa spytat, ci pri chybe db (except)
sa automaticky spravy rollback alebo sa ukonci transakcia ihned, pripadne sa caka na timeoute?

diky
mckay
Profil
MarkOh89898:
Obávám se, že kód, který uvádíte není dostačující - nejde z něho poznat co je proměnná db, která metodu, jíž se týká dotaz obsahuje. Můžu se ovšem pokusit o informovaný odhad.

V případě, že transakce, kterou chcete provést vyvolá vyjímku typu MySQLdb.Error je přerušena aktuálně prováděná funkce (nebo metoda) a navrací hodnotu následující za výrazem return. Pokud k této výjimce nedojde, pokračuje provádění funkce/metody dále a je voláno trans.commit(), které až začne provádět něco s databází. V případě chyby tedy není třeba nic rollbackovat, protože ještě nic provedeno nebylo. V případě vážnějšího zájmu si můžete nastudovat něco o transakcích.

K Vašim otázkám tedy:
1. Rollback se s nejvyšší pravděpodobností neprovede, protože není co rollbackovat.
2. Transakce rozhodně na timeout nečeká, nevidím důvod, proč by měla.
TomášK
Profil
mckay
Kód by mohl být explicitnější, ale pochopil jsem z něj, o co jde. Otázka zní, jestli vyhození výjimky ukončí transakci nebo ne. Příkaz, který by tu výjimku mohl vyhodit, uvedený není, ale je zjevné, kam ho zařadit.

MarkOh89898
Můj (nepříliš kvalifikovaný) tip je, že tam ta transakce zůstane viset a správně by bylo volat explicitní rollback. Na webu MySQL jsem našel, že existuje in_transaction, pomocí toho by se to dalo zjistit. I commit může vyhodit chybu, měl by být v tryblocku.

Podle mě je vhodná podoba (pseudokód)
try:
  tran = getTransaction()
  tran.execute()
  tran.commit()
except e:
  tran.rollback()
  throw e
MarkOh89898
Profil *
jj, tak ako to pochopil tomasK

mohol som to ale napisat fakt lepsie, sorry :)

teda ak by to padlo na commit, je mozne ze transakcia ostane vysiet tiež?

rozmyslal som ci automaticky except MySQLdb.Error neukonci transakciu pokial v nejakej je.. ale to by bola asi hlupost keby to tak fungovalo :D

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: