Single Ton (PHP/MySQL)

Hallo !

Ich habe eine PHP Datei für die ganzen Verbindungen zwischen PHP und MySQL

PHP:
class DBAdmin{ 
    private static $instance = null;              
    private        $conn     = null;
    
    private function __construct(){
    $this->conn = mysql_connect("localhost",USER,PASS);
    if(!$this->conn){
      // error message
    }
    mysql_select_db(DBMS) or die(mysql_error());
  }    
    public static function instance(){
    if(self::$instance == null){
       self::$instance = new self;
    }
    return self::$instance;
  }
}
Nun benutze ich z.B. folgendes :

PHP:
      // @File : stock.php
      $sql = ""; // irgendwas
      DBAdmin::instance()->query($sql);

Jetzt bin ich mir etwas unsicher wie das von PHP umgesetzt wird. Wenn nun z.B. 5 Benutzer gleichzeitig die stock.php aufrufen, wird für jeden Benutzer ein anderer SQL Befehl erstellt. Nun führen 5 Benutzer gleichzeitig :

PHP:
      DBAdmin::instance()->query($sql);

Muss ich hier auf Transaktionssicherheit achten ? Kann da was passieren ?

Ich weiß, dass ich z.B. bei C/C++ mit Threads aufpassen muss, wenn diese statische Methoden aufrufen. Also mutex setzen etc. Muss ich das in PHP nun auch. Ich will z.B. nicht, dass innerhalb von query() der String von User 1 durch den von User 2 überschrieben wird und User 1 dann etwas falsches ausführt !
 
Ob du auf Transaktionssicherheit achten musst, hängt vom Tabellentyp ab, den du verwendest. Bei InnoDB z.B. wird eine Tabelle für Schreibzugriffe explizit gelockt, so dass es nicht zu Race Conditions bei Schreibvorgängen kommen kann.

Edit: Ich hab das mal zu den Webbasierten Sprachen verschoben. Ich denke das passt hier besser. :)
 
ich denke nicht dass das zu einem problem führen wird.

die user selbst laufen ja jeweils in einem komplett eigenen context am webserver und da deine klasse für jeden user eine eigene mysql_connection aufruft glaube ich nicht dass es hier zu irgendwelchen überschreibungen etc. kommen kann.

weiters findet man im web recht viele php klassen die mysql via. singletons ansprechen bei denen es auch zu keinen problemen kommt.
 
Hallo !

Ja, im Netz gibt es viele Klassen. Aber ich bin etwas vorsichtig, da diese eventuell nur abgetippt wurden und niemand sich Gedanken gemacht hat über das eventuelle Problem.

@bitmuncher :

Danke für das verschieben. DBMS läuft mit innoDB. Das ist alles okay, mir geht es darum ob der Paramter von query() eventuell überschrieben wird.
 
Hallo !

Ja, im Netz gibt es viele Klassen. Aber ich bin etwas vorsichtig, da diese eventuell nur abgetippt wurden und niemand sich Gedanken gemacht hat über das eventuelle Problem.

@bitmuncher :

Danke für das verschieben. DBMS läuft mit innoDB. Das ist alles okay, mir geht es darum ob der Paramter von query() eventuell überschrieben wird.

Nein, da kann nicht passieren.
Wie bereits b4ck erwähnte, nutzt jeder Klient seinen eigenen Context.

Was du aber einbauen solltest ist ein Commit. Dieser sollte doch eher Händisch ausgeführt werden. Dadurch kannst du dann bei einer Ausnahme ohne Probleme einen Rollback machen und den Query verwerfen.
 
Hallo !

Okay, danke ! Dann werde ich dies so nutzen.

Was du aber einbauen solltest ist ein Commit. Dieser sollte doch eher Händisch ausgeführt werden. Dadurch kannst du dann bei einer Ausnahme ohne Probleme einen Rollback machen und den Query verwerfen.

Ist eingebaut in der query()

PHP:
start_transaction
query
if error
   rollback
   return false
else
   commit
   return true

Ich habe mir extra so eine Klasse gebaut, damit ich die ganze Tipparbeit nicht habe. Danke an alle !
 
Zurück
Oben