Laden...

TransactionScope OHNE using. HowTo??

Erstellt von Howard vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.960 Views
Howard Themenstarter:in
84 Beiträge seit 2007
vor 15 Jahren
TransactionScope OHNE using. HowTo??

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

4.207 Beiträge seit 2003
vor 15 Jahren

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

www.goloroden.de
www.des-eisbaeren-blog.de

Howard Themenstarter:in
84 Beiträge seit 2007
vor 15 Jahren

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....

F
10.010 Beiträge seit 2004
vor 15 Jahren

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.

Howard Themenstarter:in
84 Beiträge seit 2007
vor 15 Jahren

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

F
10.010 Beiträge seit 2004
vor 15 Jahren

Stell Dir vor, du hättest nix zu tun, und müsstest bei dem Sonneschein jetzt
draussen rumlaufen, wäre doch auch nix, oder 😉

Howard Themenstarter:in
84 Beiträge seit 2007
vor 15 Jahren

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

Howard Themenstarter:in
84 Beiträge seit 2007
vor 15 Jahren

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

4.207 Beiträge seit 2003
vor 15 Jahren

so Mädels,

[...]

Problem ist das in der LeseAusDB() Funktion, wenn sie innerhalb der Transaction läuft, der con.Open() schief geht.

  1. Die ach so lustige Anrede wird, je öfter man sie verwendet, auch nicht lustiger.
  2. Wenn man schon meint, hier pseudo-witzig sein zu müssen, wäre es schön, wenn man sich wenigstens an die Forenregeln halten könnte ([Hinweis] Wie poste ich richtig? ... Punkte 1.2 und 5).

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

Howard Themenstarter:in
84 Beiträge seit 2007
vor 15 Jahren

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:

  1. "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

  2. "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