Announcement

Collapse
No announcement yet.

Probleme mit Transaktionen und Speicherung in Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit Transaktionen und Speicherung in Tabellen

    Hallo zusammen,

    ich habe ein grosses Problem mit Transaktionen und speicherung von daten in Tabellen.

    Habe folgende Situation. Habe ca. 5 Tabellen, welche nacheinander alle mit Daten aus Temporärtabellen geinserted werden. Das Problem ist nun folgendes. Diese Operation kann auf mehreren PC's für unterschiedliche Daten ausgeführt werden. Ausserdem muss ich die Daten, welche ich einfüge, zuerst in der Tabelle löschen, da die aktualisierten in der Temporätabelle stehen. Ich bekomme aber immer beim löschen einen "Unbekannten Fehler". Wie kann man da Herr der Lager werden. Kann man die Tabellen nicht sperren, und erst wenn die ganze Transaktion durch ist, darf der 2te PC mit seiner fortfahren ?

    Ich bin für jede Hilfe dankbar, und bräuchte sofern möglich eine schnelle Antwort. Evtl. auch auf meine Mail [email protected] (_removethis wäre zu entfernen).

    Danke im voraus

    Astner Klaus

  • #2
    Hallo,

    hatte auch mal so ein Problem und das dadurch gelöst, dass ich eine Statusdatei mit einem Eintrag (Rechnername, Timestamp), wer gerade aktuell seine Arbeit macht, angelegt habe.
    Ablauf:
    wenn ein Programm starten will, liest es erst mal diesen Eintrag. Ist Rechnername leer, dann trägt es seinen eigenen Namen ein, Timestamp wird automatisch vom Server mit eingetragen.
    Dann wartet Programm 1/10 sekunde und liest Eintrag nochmal. Ist immer noch der eigene Name drinnen, dann passt alles und man beginnt mit der Arbeit, wobei mindestens alle 10 sekunden dieser Eintrag neu geschrieben wird, damit Timestamp erneuert wird (siehe weiter unten, warum). Nach Beendigung der Transaktion löscht Programm seinen Eintrag und damit kann das nächste Programm seine Arbeit beginnen.
    Ist nun beim ersten Lesen der Eintrag belegt, dann wird Timestamp gegen aktuellen Wert Datum/Zeit des Servers gecheckt. Ist der Unterschied (sicherheitshalber) größer als 30 Sekunden, so ist das andere Programm abgestürzt oder hängengeblieben oder was immer und konnte daher seinen Eintrag nicht mehr löschen (daher der Eintrag alle 10 Sekunden).
    Man könnte natürlich in dieser Statusdatei noch weitere Infos mitführen und anderen Workstations zur Verfügung stellen, also zB. welcher rechner gerade was macht, vielleicht wie weit der Fortschritt ist, ungefähre Wartezeit, ...
    Und das läuft bestens seit über 5 Jahren.

    bye,
    Helmu

    Comment


    • #3
      Hallo,<BR><BR>für diesen Zweck stehen eigentlich die Transaktionen mit dem Isolationslevel SERIALIZABLE zur Verfügung. Wenn die Aktion über eine StoredProcedure durchgeführt wird, sollte es eigentlich keine Probleme geben. Problematisch könnten andere Prozesse sein, die auch in dieser Zeit auf die benötigten Tabellen in einer anderen Reihenfolge zugreifen wollen (deadlock). Ist dies nicht der Fall, sollte das sehr stabil laufen.<BR>Allerding ist in diesem Isolationslevel kein paralleles Arbeiten möglich (wie der Name schon sagt). Sollte die Abarbeitung also längere Zeit brauchen und mehrere Leute stehen Schlange, dann ist das doch eher unbefriedigend. Ich habe das ähnlich wie Helmut gelöst, wobei ich eine zentrale Tabelle in der Masterdatenbank [SessionID] pflege. Diese produziert mir also einfach eine Nummer, die dann in allen Datenbanken eindeutig ist. Dabei haben wir die Konvention festgelegt, dass Felder von Tabellen ausschließlich den Namen [SessionID] benutzen dürfen, wenn sie auch genau zu diesem Zweck dienen. Zuerst holst du dir also eine neue Nummer und kannst dann alle Tabellen mit deinen Daten und der SessionID füllen. Auch die anschließenden Abfragen usw. schließen die Nummer mit ein, so dass sich niemand in die Quere kommt. Am Ende kannst du alle Daten in allen Tabellen mit der SessionID wider löschen, wobei das ganz einfach wieder über eine StoredProcedure geht, die über die View INFORMATION_SCHEMA.COLUMNS alle Tabellen findet, die ein Feld [SessionID] beinhalten.<BR>Lange Rede, kurzer Sinn, so kann man den Isolationslevel sehr niedrig halten und viele Leute können parallel arbeiten.<BR>Ich hoffe, ich konnte dir ein paar Anregungen geben.<BR><BR>Viele Grüße Ola

      Comment

      Working...
      X