| (Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI... |
Diskussion: PHP & PostgreSQL-Transactions im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Hi, Ich bastle gerade an einer kleinen Web-App, bei der (mehrere) Benutzer gleichzeitig an einer Datenbank arbeiten. Jeder soll ...
![]() |
| | #1 (permalink) |
| PHP & PostgreSQL-Transactions Anzeige Hi, Ich bastle gerade an einer kleinen Web-App, bei der (mehrere) Benutzer gleichzeitig an einer Datenbank arbeiten. Jeder soll dabei aber in einer Transaction arbeiten, die während seiner Session mitläuft. Am Ende soll er dann selbst entscheiden können, ob er die Änderungen übernimmt (COMIMT) oder verwirft (ROLLBACK). Ich habe das Problem mal testweise (verwende eigentlich CakePHP) in ein einfaches PHP-Skript heruntergebrochen. Nicht abschrecken lassen. Das Skript ist eingentlich ganz einfach =) (Erklärung folgt nach dem Code) PHP-Code: Es gibt folgende Operationen:
Und dann gibt es noch 2 zusätzliche Ops für Begin, Insert & Commit/Rollback. So nun zum Problem ?( Gewünschtes Verhalten wäre, dass man zuerst Beginn drückt, dann im nächsten Aufruf Insert, dann Rollback und im Nachhinein wäre der neue Eintrag nicht in der Datenbank zu sehen...tatsächlich scheint mir die Transaction am Seitenende flöten zu gehen und der Eintrag steht nach dem Rollback immernoch drin :( Das Begin, Insert & Rollback (in einem) funktioniert nämlich wie gewünscht. Wie komme ich dorthin? Scheut euch nicht zu antworten, auch nur um mir zu sagen, dass ich auf dem Holzweg bin ;) mfg Nachtrag - die Versionen: XAMPP (Apache 2.2.11, PHP 5.2.8) PostgreSQL 8.3.5 | |
| | |
| | #2 (permalink) |
| Guest Likes: | Ich kenne CakePHP ueberhaupt nicht, und habe auch noch nie was mit PostgreSQL gemacht, aber ich hab eine Ahnung. Mal ganz abgesehen davon das die Schreib und Leselocks fehlen, welche eine Transaktion eigentlich auch beinhalten muessen(werden evtl von BEGIN gesetzt,ka), passiert glaube ich folgendes: Du machst insert und Rolleback. Eine Verbindung,Server weiss was getan wurde, und kann es rückgängig machen. Du machst ein Insert, das Skript laeuft durch, und beim nächsten mal machst du ein Rolleback, was nun passiert ist, das das DBMS nicht weiss was es zurrueck nehmen soll, da neue Verbindung. mfg sw33t |
|
| HaBOT | - Anzeige - |
| |
| | #3 (permalink) | |
| Themenstarter | Danke für die Antwort! Ich denke auch nicht, dass es an CakePHP liegt, da es schon in diesem Bsp ohne Cake nicht funktioniert =/ Zitat:
Gibt es irgendeine Möglichkeit das mit Transactions zu realisieren oder sollte ich umdenken und eine eigene Lösung programmieren? | |
| | |
| | #4 (permalink) |
| Moderator ![]() Registriert seit: 19.06.06 ![]() ![]() ![]() Likes: 52 | Hast du dir mal die Tipps der User auf http://www.php.net/manual/de/function.pg-pconnect.php durchgelesen? Da war einmal ein anderes Connection-pooling und dann noch die Benutzung einer Klasse vorgeschlagen. Probier das doch mal |
| | |
| | #5 (permalink) | |
| Senior Member | Zitat:
odigo
__________________ [HaBo] @ Facebook - Gefällt mir! | |
| | |
| | #6 (permalink) |
| Guest Likes: | Da wäre auch noch das Phänomen des Phantom, aber egal... Das mit der Klasse wird nicht so funktioniere, da man in PHP keine Ressourcesn speichern kann, und eine Verbindung gilt in PHP als eine Ressource und die kannst du nun mal nicht im $_SESSION-array speichern. Ich hatte mal ein ähnliches Problem. Bei mir lag der Fall aber so, das ich eine feste Anzahl von Tables hatte, aber ich nur eine bestimmte Klasse von Einträgen, wegen Datenkonsistens, nicht freigeben wollte. Problem habe ich dadurch geloest das ich die Schluessel der Einträge in eine weitere Tabelle geschrieben habe, und ich die Einträge dann nur zum Zugriff freigab wenn sie nicht in der Tabelle standen. mfg sw33t |
|
| | #7 (permalink) |
| Themenstarter | Ja, dass das eine suboptimale Idee ist hab ich befürchtet...hat vom Prinzip her recht einfach ausgesehen. Was wäre z.B. wenn User A einen Eintrag ändert und User B ihn in seiner Transaktion löscht? Gibt dabei wohl zuviele Probleme... Jetzt bleibt mir nur es entweder selbst zu programmieren (extra Tabelle), oder auf das Feature zu verzichten Sollte ich es mit der Tabelle lösen, werde ich gern den Weg hier posten. Danke! |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| postgresql? | Seo | Linux/UNIX | 1 | 18.05.03 22:13 |