Seite 1 von 1

SQLAlchemy/Elixir, MySQL, Transactions und Character Set

Verfasst: Samstag 31. Mai 2008, 12:20
von burli
Hi,
ich arbeite mich gerade ein wenig in SQLAlchemy oder besser in Elixir ein. Da ich für spätere Anwendungen Transactions benötige habe ich darauf ein besonderes Augenmerk. Dabei ist mir aufgefallen das Elixir MyISAM Tabellen verwendet die, soweit ich weiß, nicht transaktionssicher sind.

Weiterhin ist mir aufgefallen das trotz angabe von Unicode die Tabellen nur mit cp1252

Wie kann ich das einstellen das die InnoDB Datenbank Engine verwendet wird und das die tabellen mit Unicode Charset erstellt werden?
Ist das noch in Elixir zu finden oder muss ich bei SQLAlchemy suche?
Ist der Ablauf dann auch wirklich transaktionssicher wenn ich InnoDB verwende?

Verfasst: Samstag 31. Mai 2008, 14:48
von sma
InnoDB macht deine Anwendung nicht transaktionssicher, sondern ermöglicht nur Transaktionen, die du schon selbst in `begin` und `commit` bzw. `rollback` einschließen musst bzw. das entsprechende Äquivalent von SQLalchemy benutzen musst.

(Wie man's den Datenbanktyp mit Elixier automatisch erzeugen kann, weiß ich leider nicht...)

Stefan

Verfasst: Samstag 31. Mai 2008, 15:10
von burli
sma hat geschrieben:InnoDB macht deine Anwendung nicht transaktionssicher, sondern ermöglicht nur Transaktionen, die du schon selbst in `begin` und `commit` bzw. `rollback` einschließen musst bzw. das entsprechende Äquivalent von SQLalchemy benutzen musst.
Nein, genau anders rum wird ein Schuh draus. Man kann Transaktionen mit Begin und Commit auch auf MyISAM ausführen, aber es hat keinen Effekt.

Ich lass mir die Debug Ausgaben von Elixir anzeigen und da sieht man, wenn man Flush() ausführt, das die Aktion mit Begin startet und mit Commit beendet wird, trotz dem das es sich noch um eine MyISAM Tabelle handelt.

Aber alle Befehle werden sofort ausgeführt und nicht erst durch Commit. Daher funktioniert Rollback nicht und sollte zufällig ein anderer Zugriff gleichzeitig laufen können die sich in die Quere kommen.

Im Gegensatz dazu reagiert InnoDB richtig auf Begin und Commit

Elixir macht es eigentlich schon richtig (soweit ich das sehen kann), nur mit der falschen DB Engine