gleichzeitige zugriffe auf die db

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
yks
Mitglied
Beiträge: 1295
Registriert: 10.07.2004 02:31

gleichzeitige zugriffe auf die db

Beitrag von yks »

hallo,

eine "grüne" frage...
ich hatte bei os400 (iseries) mal gelernt, daß keine gleichzeitigen zugriffe auf die db stattfinden sollten (muß nicht, aber könnte wohl probleme geben) - womit natürlich nicht die userzugriffe gemeint waren. nur inzwischen bekomme ich es nicht mehr zusammen, wie genau und warum das so war.

daher nun die frage bzgl der mysql-db :
gibt es diesen 'grundsatz' hier auch ? *vermute*
ist es demnach zb schlecht, wenn 2 admins gleichzeitig auf die db zugreifen ?
oder auf was genau bezieht sich das nochmal - und ist es bei mysql ebenso ?

überlegte mir gerade, ob es probleme für die phpbb-forums-db geben könnte, wenn ich über andere php dateien ebenfalls auf die db-daten zugreifen würde. ka warum verunsichert bin, denke eigentlich, an sich logisch, daß keine probleme geben sollte, solange die daten nur ausgelesen werden - beim schreiben wohl darauf ankommt, wie, etc, oder ?

danke + eiswürfel da laß, yks
Mit subsilver2 macht es noch viel mehr Spaß ! :)
shwepsi
Mitglied
Beiträge: 1697
Registriert: 02.06.2003 14:37
Wohnort: NRW - immer dem Monitorleuchten folgen...
Kontaktdaten:

Re: gleichzeitige zugriffe auf die db

Beitrag von shwepsi »

yks hat geschrieben:hallo,

eine "grüne" frage...
ich hatte bei os400 (iseries) mal gelernt, daß keine gleichzeitigen zugriffe auf die db stattfinden sollten (muß nicht, aber könnte wohl probleme geben) - womit natürlich nicht die userzugriffe gemeint waren. nur inzwischen bekomme ich es nicht mehr zusammen, wie genau und warum das so war.

daher nun die frage bzgl der mysql-db :
gibt es diesen 'grundsatz' hier auch ? *vermute*
ist es demnach zb schlecht, wenn 2 admins gleichzeitig auf die db zugreifen ?
oder auf was genau bezieht sich das nochmal - und ist es bei mysql ebenso ?

überlegte mir gerade, ob es probleme für die phpbb-forums-db geben könnte, wenn ich über andere php dateien ebenfalls auf die db-daten zugreifen würde. ka warum verunsichert bin, denke eigentlich, an sich logisch, daß keine probleme geben sollte, solange die daten nur ausgelesen werden - beim schreiben wohl darauf ankommt, wie, etc, oder ?

danke + eiswürfel da laß, yks
100% sicher bin ich mir nicht, aber ich meine das die Zugriffe da alle nacheinander ablaufen.
Jeder sql Befehl kommt erstmal in eine Warteschleife, erst dann wird er ausgeführt. Doppelte Zugriffe werden somit verhindert.
Die Weisheit verfolgte mich sekundenlang...
Aber sie überholte mich und war fortan nicht mehr gesehen !!!
Benutzeravatar
kellanved
Mitglied
Beiträge: 570
Registriert: 05.02.2005 15:15
Wohnort: Berlin

Beitrag von kellanved »

Synchronisierung paralleler (schreibender) Zugrifffe wird bei den heutzutage üblichen Systemen vom Datenbankprogramm selbst sichergestellt; MySql wurde für mehrere Nutzer zur gleichen Zeit entworfen.
Paralleler Zugriff ist daher kein Problem, bei längeren Skripten mit mehreren Datenbankabfragen sollte man schon vorsichtig sein.
Benutzeravatar
SD582
Mitglied
Beiträge: 307
Registriert: 08.07.2005 13:15
Wohnort: Salzburg
Kontaktdaten:

Beitrag von SD582 »

Hi

Probleme gibt es grundsätzlich dann, wenn jemand (ein script) etwas aus der DB liest, verändert und dann schreibt. Und gleichzeitig macht das auch eine andere Instanz.
1 liest
2 liest
1 ändert und schreibt
2 ändert und schreibt

2 hat gewonnen :lol:

Hier müsste man über die gesamte Transaktion die betroffenen Tabellen oder Datensätze locken. 2 darf hier erst lesen, wenn 1 fertig ist.

Allerdings weiß ich jetzt nicht, ob das Locking bei MySQL auch entsprechend vorhanden ist - denke aber doch, weils ja sehr wichtig ist.

Gruß
Franz
Benutzeravatar
Blutgerinsel
Mitglied
Beiträge: 1801
Registriert: 19.07.2004 18:53
Wohnort: Landkreis Ulm
Kontaktdaten:

Beitrag von Blutgerinsel »

SD582 hat geschrieben:Hi
Probleme gibt es grundsätzlich dann, wenn jemand (ein script) etwas aus der DB liest, verändert und dann schreibt. Und gleichzeitig macht das auch eine andere Instanz.
Was bei wikipedia der Fall sein dürfte....

Ansonsten bleibt nur zu sagen das jede Verbindung zum MySQL Server einen eigenen Thread sprich Prozess zugeordnet bekommt....

Daneben bietet MySQL noch die Möglichkeit Inserts bei niedriger Last erst auszuführen mittels Insert Delayed....
Benutzeravatar
kellanved
Mitglied
Beiträge: 570
Registriert: 05.02.2005 15:15
Wohnort: Berlin

Beitrag von kellanved »

SD582 hat geschrieben:Allerdings weiß ich jetzt nicht, ob das Locking bei MySQL auch entsprechend vorhanden ist - denke aber doch, weils ja sehr wichtig ist.
Natürlich. MySQL setzt automatisch einen Lock wenn Tabellen verändert werden sollen. Daher auch die Möglichkeit auf "Delayed Inserts" auszuweichen.

Wie gesagt: es gibt durchaus Situationen, wo man noch zusätzlich manuell einen Lock setzen muss; aber in den "normalen" Fällen reicht MySQLs Mechanismus um solche Race Conditions zu vermeiden.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

SD582 hat geschrieben:Probleme gibt es grundsätzlich dann, wenn jemand (ein script) etwas aus der DB liest, verändert und dann schreibt. Und gleichzeitig macht das auch eine andere Instanz.
1 liest
2 liest
1 ändert und schreibt
2 ändert und schreibt
Daher ist es z.B. auch sinnvoll, UPDATE tabelle SET feld=feld+1 zu verwenden anstatt erst zu lesen, dann in PHP zu erhöhen und wieder zu schreiben.

MyISAM Tabellen (das Standardformat) kennen übrigens keine Transaktionen über mehrere SQL Befehle.
KB:knigge
Benutzeravatar
D@ve
Ehemaliges Teammitglied
Beiträge: 3842
Registriert: 28.08.2002 19:33
Wohnort: Bretzfeld
Kontaktdaten:

Beitrag von D@ve »

Hmmm man könnte sich mit PHP so ne Art Transaktions-Funktion nachbauen. An die übergibt man dann ein Array mit den ganzen Queries. Die Funktion extraiert dann automatisch die verwendeten Tabellen, setzt darauf ein LOCK, führt die Queries aus und gibt sie wieder frei. Allerdings wäre man hier auch darauf angewiesen, dass das komplette Script darauf optimiert ist.

Gruß, Dave
There are only 10 types of people in the world: Those who understand binary, and those who don't
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Bevor man sich solche Würgarounds programmiert sollte man lieber gleich richtige Transaktionen verwenden (z.B. mit dem Tabellentyp InnoDB). Der phpBB-DBAL bietet ja auch schon Unterstützung für Transaktionen ($db->sql_query("blah", BEGIN_TRANSACTION) und $db->sql_query("blub", END_TRANSACTION)). Allerdings habe ich noch keinen Code gefunden, der diese Möglichkeit auch tatsächlich nutzt.
KB:knigge
Benutzeravatar
D@ve
Ehemaliges Teammitglied
Beiträge: 3842
Registriert: 28.08.2002 19:33
Wohnort: Bretzfeld
Kontaktdaten:

Beitrag von D@ve »

Pyramide hat geschrieben:Bevor man sich solche Würgarounds programmiert sollte man lieber gleich richtige Transaktionen verwenden (z.B. mit dem Tabellentyp InnoDB). Der phpBB-DBAL bietet ja auch schon Unterstützung für Transaktionen ($db->sql_query("blah", BEGIN_TRANSACTION) und $db->sql_query("blub", END_TRANSACTION)). Allerdings habe ich noch keinen Code gefunden, der diese Möglichkeit auch tatsächlich nutzt.
Hab mir das mal angeschaut, die Funktion (in includes/mysql4.php)greift aber anscheinend auf MySQL-Kommandos zurück: BEGIN, COMMIT und ROLLBACK Das verstehe ich nicht ganz. MySQL4 gilt doch als DBMS ohne Transaktionen das habe ich schon mehrmals gelesen??

Für MySQL < 4 (includes/mysql.php) ist das anscheinend garnicht implementiert, da wird der Parameter einfach ignoriert.

Gruß, Dave
There are only 10 types of people in the world: Those who understand binary, and those who don't
Antworten

Zurück zu „Coding & Technik“