Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Timeout-Zeit bei Lock

  1. #1
    bluesilisk ist offline Neuer Benutzer
    Registriert seit
    01.11.2011
    Beiträge
    7

    Frage Timeout-Zeit bei Lock

    Hallo zusammen,

    ich habe eine Frage zum Verhalten beim Zugriff mehrerer Programme auf eine Datenbank.

    Folgendes Beispiel: Programm1 schreibt in eine Datenbank, und zwar ziemlich viel, was dann auch ziemlich lange dauert. Programm2 will auch schreiben, kann aber nicht, weil die DB durch Programm1 gesperrt ist. Programm2 muss also warten. Die Frage ist nun: Wie stelle ich ein, wie lange Programm2 darauf wartet, endlich schreiben zu können? Wenn das Warten nämlich zu lange dauert, dann will ich Programm2 beenden und es dann später noch einmal probieren.

    Bei Informix gibt es den Befehl "SET LOCK MODE TO [arg]". Wenn man als Argument "WAIT seconds" angibt, dann wartet Programm2 seconds Sekunden und kommt dann mit einer Fehlermeldung zurück. Wie realisiere ich das bei Postgres?

    MfG Udo

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von bluesilisk Beitrag anzeigen
    Hallo zusammen,

    ich habe eine Frage zum Verhalten beim Zugriff mehrerer Programme auf eine Datenbank.

    Folgendes Beispiel: Programm1 schreibt in eine Datenbank, und zwar ziemlich viel, was dann auch ziemlich lange dauert. Programm2 will auch schreiben, kann aber nicht, weil die DB durch Programm1 gesperrt ist. Programm2 muss also warten. Die Frage ist nun: Wie stelle ich ein, wie lange Programm2 darauf wartet, endlich schreiben zu können? Wenn das Warten nämlich zu lange dauert, dann will ich Programm2 beenden und es dann später noch einmal probieren.

    Bei Informix gibt es den Befehl "SET LOCK MODE TO [arg]". Wenn man als Argument "WAIT seconds" angibt, dann wartet Programm2 seconds Sekunden und kommt dann mit einer Fehlermeldung zurück. Wie realisiere ich das bei Postgres?

    MfG Udo
    Eigentlich sperrt die DB so schnell nicht, kannst das mal näher beleuchten?


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    bluesilisk ist offline Neuer Benutzer
    Registriert seit
    01.11.2011
    Beiträge
    7

    Standard Beleuchten?

    Hm, also meiner Meinung nach ist ja für die Beantwortung der Frage nicht relevant, warum die Datenbank gesperrt ist. Sie ist halt von Programm1 gesperrt und nun kommt Programm2 und will auch schreiben - kann aber nicht und muss warten. Dafür muss es ja einen wie auch immer gearteten Timeout-Wert geben. Meine Frage ist nun, wie man den konfiguriert und wie man in Programm2 abfängt, dass die DB gesperrt und ein Schreibvorgang im Augenblick nicht möglich ist. Ich suche also (deswegen hab ich es mit angegeben) ein Analogon für dieses SET LOCK MODE vom Informix. MfG Udo

  4. #4
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    525

    Standard

    Zuerstmal: es wird nicht die "Datenbank" gesperrt sondern maximal ein Datensatz. Wobei die Möglichkeit besteht manuell (!) eine gesamte Tabelle zu sperren. Das bezieht sich aber immer auf einen schreibenden Zugriff. Der lesende Zugriff (SELECT ...) wird dadurch niemals verhindert.

    Solange die beiden Programme nicht den gleichen Datensatz mittels UPDATE ändern wollen, so werden sie sich auch nicht gegenseitig "sperren".

    Du musst schon etwas präziser werden wie genau die Zugriffe Deiner Programme aussehen.

    Ein Möglichkeit einen Datensatz explizit zu sperren ist mit "SELECT ... FOR UPDATE NOWAIT". Wenn Du unbedingt pessimistic locking benötigst, so wird bleibt Dir nur jeden Datensatz der geändert werden soll, vorher mit "SELECT .. FOR UPDATE NOWAIT" zu sperren. Wenn das nicht geht bekommst Du sofort einen Fehler. Einen "Timeout" gibt es dabei aber nicht, das müsstest Du selber in Deinem Programm implementiert (z.B. 10mal versuchen und dann aufgeben oder so ähnlich).

    Aber nochmal: das ist eigentlich die schlechteste Methode mit einer relationalen DB zu arbeiten. Wenn die Programme nicht wirklich ständig die gleichen, identischen Datensätze ändern wollen, dann überlass das lieber der Datenbank.
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  5. #5
    bluesilisk ist offline Neuer Benutzer
    Registriert seit
    01.11.2011
    Beiträge
    7

    Standard

    Hallo castorp,

    Zitat Zitat von castorp Beitrag anzeigen
    Zuerstmal: es wird nicht die "Datenbank" gesperrt sondern maximal ein Datensatz. Wobei die Möglichkeit besteht manuell (!) eine gesamte Tabelle zu sperren. Das bezieht sich aber immer auf einen schreibenden Zugriff. Der lesende Zugriff (SELECT ...) wird dadurch niemals verhindert.

    Solange die beiden Programme nicht den gleichen Datensatz mittels UPDATE ändern wollen, so werden sie sich auch nicht gegenseitig "sperren".
    Das ist ja genau das Problem: beide Programme greifen SCHREIBEND auf die Datenbank zu und blockieren dadurch (hatte ich das schon erwähnt?).

    Du musst schon etwas präziser werden wie genau die Zugriffe Deiner Programme aussehen.

    Ein Möglichkeit einen Datensatz explizit zu sperren ist mit "SELECT ... FOR UPDATE NOWAIT". Wenn Du unbedingt pessimistic locking benötigst, so wird bleibt Dir nur jeden Datensatz der geändert werden soll, vorher mit "SELECT .. FOR UPDATE NOWAIT" zu sperren. Wenn das nicht geht bekommst Du sofort einen Fehler. Einen "Timeout" gibt es dabei aber nicht, das müsstest Du selber in Deinem Programm implementiert (z.B. 10mal versuchen und dann aufgeben oder so ähnlich).

    Aber nochmal: das ist eigentlich die schlechteste Methode mit einer relationalen DB zu arbeiten. Wenn die Programme nicht wirklich ständig die gleichen, identischen Datensäze ändern wollen, dann überlass das lieber der Datenbank.
    Und wenn sie nun - wie in meinem Fall - ständig die gleichen, identischen Datensätze ändern wollen, was mache ich dann? Womit wir wieder bei der eigentlichen Frage wären ...

    Das mit dem NOWAIT ist mir bekannt, aber keine Lösung, weil ich dann für die Informix-Variante anderen Code brauche als für Postgres. Meine Hoffnung war, etwas für den Postgres-Zugriff zu finden, das genauso funktioniert wie bei Informix, aber das scheint nun leider nicht zu klappen, schade!

    MfG Udo

  6. #6
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    525

    Standard

    Zitat Zitat von bluesilisk Beitrag anzeigen
    Das mit dem NOWAIT ist mir bekannt, aber keine Lösung, weil ich dann für die Informix-Variante anderen Code brauche als für Postgres
    Das wirst Du sowieso benötigen.

    Wenn ein Programm unabhängig vom drunterliegenden DBMS ist, bedeutet das nur, dass das Programm auf allen Platformen gleichmässig langsam (und vermutlich schlecht) läuft.

    Versuch einen vernünftigen Abstraktionslayer zu schreiben über den das Programm auf die DB zugreift und in dem Layer verwendest Du die ganzen DB spezifischen Features.
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

  7. #7
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Zitat Zitat von bluesilisk Beitrag anzeigen
    Und wenn sie nun - wie in meinem Fall - ständig die gleichen, identischen Datensätze ändern wollen, was mache ich dann? Womit wir wieder bei der eigentlichen Frage wären ...
    Wieso dauern deine Transaktionen überhaupt so lange?
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  8. #8
    bluesilisk ist offline Neuer Benutzer
    Registriert seit
    01.11.2011
    Beiträge
    7

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Wieso dauern deine Transaktionen überhaupt so lange?
    All zu viel möchte/kann/darf ich dazu nicht sagen, nur so viel: ein Server startet bei eingehenden Modem-Verbinungen COM-Services, die die Daten abholen und in die DB schreiben. Da Modem nun mal langsam ist und viele Daten gesendet werden, dauert die Übertragung schon mal ein paar Minuten. So eine Modem-Verbindung (z. B. aus dem Ausland) ist auch heute noch recht teuer, also soll die zweite Verbindung nicht ewig warten, sondern nach ein paar Sekunden abbrechen und dem "Anrufer" sagen, er soll es später noch einmal probieren. Bei der Informix-Variante wurde das mit dem SET LOCK MODE realisert, und meine Hoffnung war ganz einfach, für Postgres ein Pendent zu finden. Am Quellcode der Services kann ich selber nämlich gar nicht so viel machen.

  9. #9
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Es gibt da so eine neumodische Erfindung, nennt sich Internet ;-)

    Abgesehen davon: das Konzept, auf beliebig lange Wartezeiten zu warten, hört sich für mich umständlich an.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  10. #10
    bluesilisk ist offline Neuer Benutzer
    Registriert seit
    01.11.2011
    Beiträge
    7

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Es gibt da so eine neumodische Erfindung, nennt sich Internet ;-)

    Abgesehen davon: das Konzept, auf beliebig lange Wartezeiten zu warten, hört sich für mich umständlich an.
    Naja, das Programm soll ja eben genau nicht "beliebig", sondern "definiert" lange warten. Was genau würde denn passieren, wenn Programm1 eine Tabelle mit UPDATE beschreibt und Programm2 auf die selbe Tabelle ebenfalls ein UPDATE machen will? Dann wartet Programm2, bis sein SQL-Statement ausgeführt wurde, selbst wenn es sich da um Minuten oder gar Stunden handeln kann, oder? Ich hätte halt gern (analog zum Ifx) die Möglichkeit, dem SQL-Statement (bzw. wie bei Ifx der ganzen Connection) mitgeben zu können, wie lange es maximal warten soll, um dann mit einem Fehlercode "Timeout" zurück zu kommen. Ich selber kann nur die SQL-Strings und nicht die Services anfassen.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. PgAdmin stürzt ab bei Timeout (Ubuntu)
    Von Thomas_M im Forum PGAdmin
    Antworten: 4
    Letzter Beitrag: 30.01.2010, 18:59
  2. TimeOut der Verbindung
    Von davidy im Forum PGAdmin
    Antworten: 4
    Letzter Beitrag: 09.10.2009, 13:17
  3. Unable to insert lock record
    Von palzwoi im Forum Konfiguration
    Antworten: 3
    Letzter Beitrag: 04.10.2007, 17:46
  4. Transaction Timeout
    Von johanna im Forum Programmierung
    Antworten: 1
    Letzter Beitrag: 11.07.2007, 13:01
  5. connection timeout ?
    Von sladda im Forum Allgemeines
    Antworten: 3
    Letzter Beitrag: 19.06.2007, 08:36

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum