Parallelitäsverletzung bei Transaction

15/11/2007 - 07:56 von Sandra | Report spam
Hallo NG,

ich komme einfach nicht weiter bei der Fehlerbehandlung einer
Parallelitàsverletzung.
User 1 àndert Daten = Update, User 2 àndert auch diese Daten und will ein
Update machen:
//Code:
public void SetData(SqlCommand cmdUpdateCommand, string strTableName)
{
conn.Open();
SqlTransaction transaction = conn.BeginTransaction();

try
{
cmdUpdateCommand.CommandType = CommandType.Text;
cmdUpdateCommand.Transaction = transaction;
da.UpdateCommand=cmdUpdateCommand;
da.Update(ds.Tables[strTableName]);
transaction.Commit();
}
catch (DBConcurrencyException Datensatz)
{
// Datensatz wurde inzwischen geàndert
MessageBox.Show(Datensatz.Message.ToString());
}
catch (System.Data.SqlClient.SqlException SQLError)
{
MessageBox.Show(SQLError.Message.ToString(),"SQL Fehler");
transaction.Rollback();
}
catch (Exception DBError)
{
MessageBox.Show(DBError.Message.ToString(),"Datenbank Fehler");

}
finally
{
conn.Close();
}
}

In der ersten catch Anweisung wird die Parallelitàsverletzung abgefangen.
Dort möchte ich ein Dialog implementieren, welcher Abfragt
Daten überschreiben oder Ansicht aktualisieren. Der Dialog ist sicher nicht
das Problem, aber bei einer neuen Update Anweisung bzw commit
wird der Fehler wieder erzeugt ich muss dem Dataadapter also sagen
überschreibe beim Update aber wie?

Bin für jeden Tipp dankbar
Vorab danke für die Hilfe

Sandra
 

Lesen sie die antworten

#1 Peter Fleischer
15/11/2007 - 08:38 | Warnen spam
"Sandra" schrieb im Newsbeitrag
news:

In der ersten catch Anweisung wird die Parallelitàsverletzung abgefangen.
Dort möchte ich ein Dialog implementieren, welcher Abfragt
Daten überschreiben oder Ansicht aktualisieren. Der Dialog ist sicher
nicht das Problem, aber bei einer neuen Update Anweisung bzw commit
wird der Fehler wieder erzeugt ich muss dem Dataadapter also sagen
überschreibe beim Update aber wie?



Hi Sandra,
die Parallelitàtsverletzung wird durch die WHERE-Klausel im genutzten
Update- bzw. Delete-CommandString erkannt. Wenn du also wàhlen willst
zwischen Erkennen mit Abbruch und brutal Überschreiben, dann musst du
verschiedene CommandTexte nutzen.

Ich würde anders herangehen. Wenn nicht generell zu überschreiben ist ("Der
Letzte gewinnt"), dann führe bei einer Parallelitàtsverletzung ein Rollback
durch, lade den aktuellen Stand in die Originalwerte, informiere den
Anwender und lasse ihn entscheiden, ob er nochmals ein Update ausführen
will, was dann ohne Parallelitàtsverletzung ablàuft, es sei ein anderer war
schneller. Wenn wirklich ein anderer schneller war, dann muss der Vorgang
eben nochmals wiederholt werden.

Viele Gruesse

Peter

Ähnliche fragen