Laden...

Was sagt mir die Meldung: "Transaktionen mit IsolationLevel-Snapshot können nicht erweitert werden"?

Erstellt von Howard vor 14 Jahren Letzter Beitrag vor 14 Jahren 834 Views
Howard Themenstarter:in
84 Beiträge seit 2007
vor 14 Jahren
Was sagt mir die Meldung: "Transaktionen mit IsolationLevel-Snapshot können nicht erweitert werden"?

verwendetes Datenbanksystem: SQLServer 2005

Ich bekomme die Meldung "Transaktionen mit IsolationLevel-Snapshot können nicht erweitert werden." bei folgendem Code:


public class DBLogic
{
	public DbConnection OpenConnection()
	{
		DbConnection    retConnection;
		String          connString ="...";
	
		dataProviderFactory             = DbProviderFactories.GetFactory("System.Data.SqlClient");
		retConnection                   = dataProviderFactory.CreateConnection();
		retConnection.ConnectionString  = connString;
		retConnection.Open();
		
		return retConnection;
	}
	
	public void GetFullKontaktList<T>()
	{
		...
		using (DbConnection connection = OpenConnection()) <-- Exception
		{...}
	}
}

public class DBForm
{
	private void button1_Click(object sender, EventArgs e)
	{
		TransactionScopeOption  tssOptions  = new TransactionScopeOption();
		TransactionOptions      tsOptions   = new TransactionOptions();
		
		tsOptions.IsolationLevel = System.Transactions.IsolationLevel.Snapshot;
		tsOptions.Timeout        = new TimeSpan(0, 0, 0, 0, 0);
		
		using(TransactionScope ts = new TransactionScope(tssOptions,tsOptions))
		{			
			DBLogic.GetFullKontaktList<Person>();
			DBLogic.GetFullKontaktList<Firma>(); <-- Exception
		}		
	}
}

Ich kann mit der Meldung GARNIX anfangen...irgendwer ne Idee??

Howard

4.207 Beiträge seit 2003
vor 14 Jahren

Beim zweiten GetFullKontaktList-Aufruf öffnest Du eine zweite Verbindung zur Datenbank - in diesem Moment versucht der SQL Server, aus der zuvor lokalen Transaktion eine verteilte zu machen (mit Hilfe des MS DTC).

Dieser Vorgang (auch bekannt als Transaction Propagation) wird bei Transaktionen mit Isolationslevel Snapshot anscheinend nicht unterstützt.

Lösung:

  • Entweder ein anderes Isolationslevel verwenden
  • oder nur eine Datenbankverbindung nutzen

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 14 Jahren

Danke für die schnelle Antwort.

  • oder nur eine Datenbankverbindung nutzen

Okay aber wie soll ich DAS denn lösen? dieses ...OpenConnection() ist doch in einer völlig anderen Klasse. Die hat doch keine Ahnung das sie

  1. innerhalb einer Transaction läuft
  2. mehrfach hintereinander aufgerufen wird....

Ich dachte genau für sowas nimmt man die "ambient" Transactions???? (oder hab ich doch keine??)

Howard

S
8.746 Beiträge seit 2005
vor 14 Jahren

Transaktionen gehören eben auch in den DAL.

Vielleicht wird dir diese Diskussion helfen:

http://social.msdn.microsoft.com/Forums/en-US/architecturegeneral/thread/e17dd8ca-cd4f-49ac-88c4-f0a185029d7c

Oder sowas um die Connection durchzuschleppen:

http://blogs.msdn.com/dataaccess/archive/2006/02/14/532026.aspx