Používáte na každou malou změnu/zápis Transakce?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
knyttl
Člen | 196
+
0
-

Ahoj,

(Předem bych nerad, aby z tohohle vznikl nějaký flame/hate.)

používám v Javě Hibernate, který vynucuje vytvoření transakcí pro jakoukoliv změnu/zápis do databáze. Asi je to myšleno v dobrém duchu, nicméně člověk korektně dbát na správné uspořádání transakcí a spoustu dalších věcí, aby nedocházelo k deadlockům. Ke kterým pak ale při velkém trafficu může docházet (podle stackoverflow) a transakce je nutné manuálně restartovat. Atd atd.

Do teď jsem to nějak akceptoval, ale pomalu se s tím odmítám smířit. Skutečně je to správné mít na všechno transakce? Vynucuje toto i Doctrine? Vytváříte na _všechno_ transakce i v dibi či Nette\Database?

Díky.

Jan Tvrdík
Nette guru | 2595
+
+1
-

Bavíme se o MySQL? Netuším, čemu říkáš všechno, ale rozhodně většina dotazů (selecty, jednoduché updaty a inserty) transakce na nic nepotřebuje.

newPOPE
Člen | 648
+
+2
-

Vo vseobecnosti by sme mohli povedat, ze transakciu pouzi vtedy ak potrebujes ovplyvnit data v viacerych tabulkach tak aby ti niekto (napr. iny proces) medzi nerozbil konzistenciu dat.

A pokial sa bavime o mySQL tak tam je to v advanced pouziti dost divocina :)

knyttl
Člen | 196
+
0
-

Jan Tvrdík napsal(a):

Bavíme se o MySQL? Netuším, čemu říkáš všechno, ale rozhodně většina dotazů (selecty, jednoduché updaty a inserty) transakce na nic nepotřebuje.

Mno, myslel jsem to spíš obecně, máš na mysli něco konkrétního s MySQL?

Vo vseobecnosti by sme mohli povedat, ze transakciu pouzi vtedy ak potrebujes ovplyvnit data v viacerych tabulkach tak aby ti niekto (napr. iny proces) medzi nerozbil konzistenciu dat.

A pokial sa bavime o mySQL tak tam je to v advanced pouziti dost divocina :)

Proč je to v MySQL divočina? V jiných DB to není divočina?

Jak to řeší ta Doctrine, také transakce vynucuje?

Filip Procházka
Moderator | 4668
+
+2
-

Doctrine si otevírá (bezpodmínečně) transakce na flushování – tedy když ukládá do databáze.

Btw, víš že když uděláš 5 insertů v transakci, je to stejně rychlé, jako jeden multiinsert s pěti setama hodnot? Každý insert se totiž sám interně obaluje transakcí a tedy otevírat na updaty a inserty transakci znamená ukládat rychleji :)

Jan Tvrdík
Nette guru | 2595
+
0
-

víš že když uděláš 5 insertů v transakci, je to stejně rychlé, jako jeden multiinsert s pěti setama hodnot?

To není úplně pravda, protože samotná komunikace s databází má dost značný overhead. Zkus si vložit 1000 řádků do databáze a přeměřit si to.

Filip Procházka
Moderator | 4668
+
0
-

@JanTvrdík máš pravdu že to není úplně 100% přesné, ale to že udělat tisíc insertů v transakci je rychlejší než bez transakce je fakt :)