SqlDataReader

13/09/2008 - 14:36 von Marcel Beutner | Report spam
Hallo NG,

ich habe eine Frage zu dem Locking Verhalten von ado.net. Bisher bin
ich davon ausgegangen das beim ExecuteReader (SQLClient Data Provider)
ein shared Lock auf die Datensatzmenge gemacht wird. So dass man im
Read Vorgang kein UPDATE Befehl ausführen kann, der einen DS dieser
Menge betrifft (Da ein Update Befehl ja einen Exclusiven lock
anfordert).


wieso funktioniert aber folgender konstrukt:

<code>
reader = da.ExecuteReader("SELECT * FROM MyTable")

while(reader.Read())
{
da.ExecuteScalar("UPDATE MyTable SET Field=1");
}
</code>

ich hàtte jetzt erwartet, das er beim UPDATE einfach stehen bleibt...
Kann es eventuell eine Einstellung am SQL Server 2005 sein?

Vielen Dank im voraus!

gruss marcel


PS: Laut SQL Profiler finden recht viele locks UND _unlocks_ beim
ExecuteReader Aufruf statt??
 

Lesen sie die antworten

#1 Frank Dzaebel
13/09/2008 - 20:19 | Warnen spam
Hallo Marcel,

ich habe eine Frage zu dem Locking Verhalten von ado.net.



gut, zwar gehört die Frage in die DB-Gruppe, wo Du sie
ja auch gestellt hast, aber dort hat man ja manchmal eine
recht lange Wartezeit.

Zunàchst möchte ich Dich bitten, detaillierteren
Code zu posten, denn ich bekomme zum Beispiel
bei folgendem Code eine saubere Fehlermeldung:


string conString = "Data Source=" + Environment.MachineName +
";Initial Catalog=Frank;Integrated Security=True";
string commandText = "SELECT * FROM Person";
string updateText = "UPDATE Person SET Field=1";
SqlConnection conn = new SqlConnection(conString);
conn.Open();
SqlCommand cmd = new SqlCommand(commandText, conn);
SqlCommand cmdUpdate = new SqlCommand(updateText, conn);
SqlDataReader reader = cmd.ExecuteReader();
while(reader.Read())
{
cmdUpdate.ExecuteScalar();
// Exception: "Diesem Befehl ist bereits ein geöffneter DataReader
// zugeordnet, der zuerst geschlossen werden muss."
}
reader.Close();


___________________

Trotzdem ein paar Infos:

gut, zunàchst mal gilt nach Doku:

"Wàhrend der Verwendung des SqlDataReader ist die
zugeordnete SqlConnection durch den Informationsfluss
für den SqlDataReader belegt, sodass an der
SqlConnection keine anderen Operationen ausgeführt
werden können, außer diese zu schließen. Dies gilt
solange, bis die Close-Methode von SqlDataReader
aufgerufen wird." [...]

[SqlDataReader-Klasse (System.Data.SqlClient)]
http://msdn.microsoft.com/de-de/lib...eader.aspx

Letztlich wird sowas ja normal durch einen Backend DB-Cursor
implementiert, und stellt einen schreibgeschützten
Vorwàrtsdatenstream dar. Die Ergebnisse werden ja bereits wàhrend
der Ausführung der Abfrage zurückgegeben und im Netzwerkpuffer
auf dem Client gespeichert, bis sie mit der Read-Methode abgefragt werden.
Auch sind ja: "Änderungen an einem Resultset, die wàhrend des Lesens
der Daten durch einen anderen Prozess oder Thread vorgenommen werden,
für Benutzer des SqlDataReader möglicherweise sichtbar."
Nur ist das zeitabhàngig.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen