verwendetes Datenbanksystem: <MSSQL2005>
Okay Ladys ich hoffe mir kann einer helfen:
Wo auch immer ich Beispiele finde zu TransactionScope geht es immer über
using (TransactionScope ts = new TransactionScope())......
Nun hab ich aber schon (gefühlte) 1000 Funktionen in die möchte ich NICHT überall diese using Sache nachträglich einbaun.
Diese (gefühlten) 1Mio. Funktionen 😁 benutzen bisher EINE gemeinsame Connection die zu Programmstart geöffnet und am Ende wieder geschlossen wird.
Nun muss ich mehrere Funktionen bauen die Transactions benutzen sollen und auch einige der vorhandenen aufrufen sollen. Ist der Plan da besser nicht TransactionScope sondern System.Transaction zu benutzen oder was wäre hier der richtige Weg??
Howard
P.S.: ich hoffe man hat mich verstanden 8o
Natürlich kannst Du den TransactionScope auch ohne using verwenden - dann musst Du halt per Hand Dispose aufrufen, und sicherstellen (!), dass das passiert.
Also letztlich ein try / finally drumherum - da ist das dann mit using aber irgendwie doch wieder einfacher 😉.
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
okay ich versuchs mal etwas mehr zu spezifizieren....
////////////////////////////////////////////
//-----MAINKLASSE--------------------------
////////////////////////////////////////////
public Constructor() //der MAINKLASSE
{
HilfsKLASSE.OpenConnection();
FunktionNeu1();
}
void FunktionALT2()
{
HilfsKLASSE.AbfrageAusfuehren();
FunktionALT2();
}
void FunktionALT2()
{
HilfsKLASSE.AbfrageAusfuehren();// <- Hier gehts schief!!!!!
}
//------NEUE FUNKTIONEN-------------------------------------------------
void FunktionNeu1()
{
TransactionScope ts;
ts = HilfsKLASSE.TransactionBegin();
FunktionALT1();
FunktionNeu2();
......
HilfsKLASSE.TransactionCommit(ts);
}
void FunktionNeu2()
{
TransactionScope ts;
ts = HilfsKLASSE.TransactionBegin();
.....
HilfsKLASSE.TransactionCommit(ts);
}
////////////////////////////////////////////////////////////////////
//------HilfsKLASSE-------------------------------------------------
////////////////////////////////////////////////////////////////////
private TransactionScope rootTransactionScope = null;
private DbConnection connection;
public void OpenConnection()
{
connection.open();
....
}
public TransactionScope TransactionBegin()
{
TransactionOptions tsOptions = new TransactionOptions();
tsOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
tsOptions.Timeout = scopeTimeout;
rootTransactionScope = new TransactionScope(TransactionScopeOption.RequiresNew,tsOptions );
return rootTransactionScope;
}
public void TransactionCommit(TransactionScope ts)
{
ts.Complete();
ts.Dispose();
....
}
public void AbfrageAusfuehren(....)
{
DbCommand cmd = .....CreateCommand();
DbConnection transConnection;
if (RootTransactionScope != null)
{
transConnection = .....CreateConnection();
transConnection.Open();// <- Hier gehts schief!!!!!
cmd.Connection = transConnection;
}
else
{
cmd.Connection = this.connection;
}
doSQLStuff....
}
Das Problem sind die connections die ja erst NACH dem TransactionScope geöffnet werden dürfen.
Also merk ich mir mit HilfsKLASSE.RootTransactionScope das eine TRansaction offen ist. Aber genau das führt zum Problem mit dem DTC.
Nächste Idee ist: bei HilfsKLASSE.TransactionBegin() auch noch die connection mit zurückgeben zu lassen (die dann DORT schon gleich geöffnet wird) damit ich die richtige habe aber eventuell gehts ja irgendwie einfacher. sowas wie EnlistTransaction(...) oder so.
Ich geb zu so ganz seh ich da noch nicht durch bei den ganzen Möglichkeiten die ma dort hat X(
Howard
P.S.: ich hoffe man hat's verstanden....
Diese Diskusion hatten wir hier so oft.
Das ist wieder ein "schönes" Beispiel, wie man es nicht machen sollte:
[Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen
Also egal was Du meinst welchen Aufwand der Umbau bedeutet, eine globale
Connection ist definitiv der falsche Weg, egal was Du glaubst.
Du kannst jetzt natürlich versuchen das alles hinzufrickeln, das wird dann
aber nichts anderes sein als eben das, Frickelei.
Und mit jeder zusätzlichen Funktion wird es schlimmer.
TOLL, ich glaub dir ja (und den ganzen Threads die ich nun gerade durchgelesen hab)
Aber weiste was du mir da für arbeit aufgehalst hast?? ALLDA ich werd irre....
Aber gut. wie sagte schon ein weiser Mann: "Erst kommt richtig, dann kommt schnell" 😁
Howard
Stell Dir vor, du hättest nix zu tun, und müsstest bei dem Sonneschein jetzt
draussen rumlaufen, wäre doch auch nix, oder 😉
das iss gut imma schön Positiv Denken...das bringt weita....
nunja ich hab schon ma die Ärmel hochgekrämpelt...warte nun nur noch das mein Chef mich vollschreit wenn ichs im erzähle =)
howard
so Mädels,
ich bin ja lernfähig und bin gerade am alles Umbaun (wasn Wahnsinn)
Nu gibbet aber nen neues Prob:
Mein Prog hat (sehr sehr vereinfacht) folgenden Ablauf:
public void Main()
{
MessageBox LeseAusDB();
LöscheDaten();
}
public String LeseAusDB()
{
using(DbConnection con = new DbConnection(....))
{
//lese mal Daten aus der DB
....
}
return Daten;
}
public void LöscheDaten()
{
using(TransactionScope ts = new TransactionScope(....))
{
using(DbConnection con = new DbConnection(....))
{
Daten = LeseAusDB(); <-- DER GEHT SCHIEF wegen der neuen Connection
//lösche mal alle Daten die gelesen wurden
....
}
}
}
Ich muss also die lesen Funktion einmal zur Anzeige benutzen und anderes Mal fürs Löschen (wie gesagt absulut vereinfacht dargestellt)
Problem ist das in der LeseAusDB() Funktion, wenn sie innerhalb der Transaction läuft, der con.Open() schief geht. Wenn ich da auch noch ne Transaction rumbaue dann gehts natürlich aber das kann doch nich der Sinn sein das ich auch noch allen Lesen-Functions eine Transaction verpassen muß....ODER??? 8o
Howard
so Mädels,
[...]
Problem ist das in der LeseAusDB() Funktion, wenn sie innerhalb der Transaction läuft, der con.Open() schief geht.
Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden
Mensch Leute warum denn immer so verklemmt .... X( das Leben an sich iss doch schon nicht zum lachen.....menno
zu **"1.2 Nur ein Thema pro Thread" **
Ich denke schon das diese Thema hier einfach weiter geht denn der Fehler war vorher einfach schon der gleiche. Wenn Gewünscht kann ich aber auch gern nen neues Thema auf machen....
zu 5. Problem genau beschreiben, inkl. genauer Fehlermeldung
hier die Fehlermeldung:
"Der Netzwerkzugriff für den Manager für verteilte Transaktionen (MSDTC) wurde deaktiviert. Aktivieren Sie DTC für den Netzwerkzugriff in der Sicherheitskonfiguration für MSDTC, indem Sie das Verwaltungstool Komponentendienste verwenden."
System.Transactions.TransactionManagerCommunicationException
"Der Transaktions-Manager hat die Unterstützung für Remote-/Netzwerktransaktionen deaktiviert. (Ausnahme von HRESULT: 0x8004D024)"
System.Runtime.InteropServices.COMException
Ich habs nochmal kontrolliert der DTC ist an und auf Netzwerkzugriff eingestellt!!!
Howard