Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Parallele Transaktionen
Ishildur
myCSharp.de - Member



Dabei seit:
Beiträge: 431
Herkunft: Schweiz

Themenstarter:

Parallele Transaktionen

beantworten | zitieren | melden

Hallo zusammen, weiss jemand von euch, wie ich erreichen kann, dass parallele Transaktionen zugelassen werden?

Ich muss bspw. eine Transaktion starten, um einen Kunden zu bearbeiten, und schliesslich eine weitere (Unter) - Transaktion, um dessen Zahlungen zu bearbeiten...

Lg Ishildur
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.956

beantworten | zitieren | melden

Bei .NET ist das nicht vorgesehen, da Du nur von der Connection
ein Transactions-Objekt bekommst.

Ist auch nicht wirklich etwas was man braucht, denn im alg. wird
genau eine Aktion komplett von einer Transaktion eingerahmt.

Und der Sql-Server unterstützt auch keine Nested-Transactions.
private Nachricht | Beiträge des Benutzers
Pulpapex
myCSharp.de - Member



Dabei seit:
Beiträge: 939
Herkunft: Rostock

beantworten | zitieren | melden

Na fürs Logging kann man sowas auf jeden Fall gebrauchen. Innerhalb einer Transaktion werden werden viele kleine Transaktionen für Log-Ausgaben durchgeführt. Wenn jetzt die grosse Transaktion schiefläuft, bleiben die Log-Einträge trotzdem erhalten. Wie kann man das anders nachbilden?

In Java ist sowas kein Problem. Dort gibt man der Logging-Methode eine Annotation (ein Attribut) mit, dass sie in einer eigenen Transaktion laufen soll. Eine schon laufende Transaktion wird in der Zeit ausgesetzt und im Anschluss normal fortgesetzt. Beide Transaktionen laufen unabhängig von einander.

Ich hab aber keine Ahnung wie das auf Datenbank-Ebene gelöst ist, also welche Befehle an die Datenbank gesendet werden. Das ist das Problem mit Attributen/Annotationen. Man weiss nicht mehr genau was da eigentlich passiert. Auf jeden Fall soll es auch mit dem MS SQL-Server funktionieren.

Hier steht was davon, dass es deklarative Transaktionen ab Version 2.0 auch in .Net gibt:
http://www.trivadis.ch/Images/basta_transactions_tcm16-12671.pdf


Gruss
Pulpapex
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Schlagt mich tot, aber wofür gibt es Isolationslevel und benannte Transaktionen, wenn Transaktionen nicht parallel laufen können?

Dass der MSSQL keine nested transactions unterstützt hat ja nun mit Parallelität erstmal wenig zu tun, oder?
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.956

beantworten | zitieren | melden

Svenson, nur weil Ishildur Parallel schreibt, heisst das nicht, das er das auch meinte.

Könntest Du bitte den Text durchlesen, dann siehst Du das er "nested Transaction"
meint, und die werden vom Framework nicht unterstützt.

Man kann immer vieles anders machen, aber das war ja nicht seine Frage.
private Nachricht | Beiträge des Benutzers
Ishildur
myCSharp.de - Member



Dabei seit:
Beiträge: 431
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

Nein, ich meine nicht "nested transactions" sondern parallele Transaktionen, genauso wie ichs geschrieben habe...

Ich habe bspw. eine Tabelle mit Ländern und eine Tabelle mit Kunden, welche auf die Ländertabelle zeigt. Nun bin ich bspw. gerade dabei, die Kundentabelle zu bearbeiten und habe hierfür eine Transaktion gestartet. Nun möchte ich in der Ländertabelle noch schnell in einer "parallelen" Transaktion einen Entrag hinzufügen, ohne dass ich vorher die Transaktion der Usertabelle beenden muss!


this.sqlCon.BeginTransaction();
this.sqlCon.BeginTransaction();
Zitat
SqlConnection does not support parallel transactions.

Lg Ishildur
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.956

beantworten | zitieren | melden

Und was sagt die Fehlermeldung?

Ist doch wohl eindeutig.
private Nachricht | Beiträge des Benutzers
Ishildur
myCSharp.de - Member



Dabei seit:
Beiträge: 431
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

Und wieso gibts dann benannte Transaktionen?
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.956

beantworten | zitieren | melden

Der SqlServer versteht das, die SqlConnection aber nicht.

Deshalb steht da ja auch "SqlConnection does not support parallel transactions."

Du musst das dann selber machen, mit ein paar SqlCommands.
Aber vergiss kein "finally", sonst kannst Du u.U. die gesammte DB sperren.
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Will meinen, dass du für jede Transaction eine neue Connection holen musst, dann funzt es auch mit der Parallelität. Alternativ könnte man Transaktions-Kommandos direkt ins SQL einbauen.
private Nachricht | Beiträge des Benutzers
Wolf_maYer
myCSharp.de - Member

Avatar #avatar-2284.jpg


Dabei seit:
Beiträge: 286
Herkunft: Bochum

beantworten | zitieren | melden

Hallo,
ich grabe diesen alten Beitrag mal heraus, weil ich ebenfalls das Problem habe, dass ich mehrere parallele Transaktionen ausführen möchte.

Allerdings führe ich sie von verschiedenen Clients aus und habe demnach auch unterschiedliche Connections über die ich die Transaktionen ausführe.

Muss ich bei den Transaktionen etwas angeben, was ich noch nicht kenne?

Weiß jemand, wo ich mich da einlesen kann oder kennt jemand eine Lösung?

Die Query Wait option bringt nicht viel, da ich in meiner Applikation Transaktionen habe die auch mal sehr lange sein können.

Danke für eure Mühe.

Gruß, maYer
private Nachricht | Beiträge des Benutzers
Wolf_maYer
myCSharp.de - Member

Avatar #avatar-2284.jpg


Dabei seit:
Beiträge: 286
Herkunft: Bochum

beantworten | zitieren | melden

Vielleicht sind das noch zu wenige Infos über die Inhalte der Transaktionen.
Ich skizziere hier einmal die Schnittstellen.

Transaktion A:
Schreibt zig Datensätze in Tabelle TAB_A, TAB_B und TAB_C.

Transaktion B:
Schreibt einen Datensatz in TAB_A und ändert einen vor Transaktion A vorhandenen Datensatz in TAB_B.

Das bedeutet für mich, dass die Transaktionen nicht auf die selben Datensätz zugreifen.

In der Versionsunterscheidung der MS SQL Server MSSQL 2005 Versionen steht, dass nur die Enterprise Version Parallele Index Operationen unterstützt. Ist damit gemeint, dass in parallelen keine Indizes generiert werden können?

In den Tabellen A, B und C haben jeweil ein AutoInkrement als Index.

Wenn noch mehr Informationen benötigt werden, trage ich sie gerne nach.

Gruß, maYer
private Nachricht | Beiträge des Benutzers
Wolf_maYer
myCSharp.de - Member

Avatar #avatar-2284.jpg


Dabei seit:
Beiträge: 286
Herkunft: Bochum

beantworten | zitieren | melden

Auch das herunterstellen des TransaktionsIsolationslevel auf READ UNCOMMITTED hat leider keine Besserung bewirkt.

Ich wusel mal weiter und hoffe, dass jemand hier mir in der Thematik weiter helfen kann.

Gruß, maYer
private Nachricht | Beiträge des Benutzers
Wolf_maYer
myCSharp.de - Member

Avatar #avatar-2284.jpg


Dabei seit:
Beiträge: 286
Herkunft: Bochum

beantworten | zitieren | melden

Soo,
nun habe ich meine Lösung gefunden und möchte sie auch allen anderen zur Verfügung stellen.

Ich mußte die Datenbank umstellen mit:

ALTER DATABASE MY_DATABASE
SET ALLOW_SNAPSHOT_ISOLATION ON
und anschließend beim beginnen der Connection das Transaktions - Isolations - Level wie folgt setzen:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Schöne Grüße,

maYer
private Nachricht | Beiträge des Benutzers