Hallo,
ich benötige den letzten eingefügten Int-Werte einer Tabelle innerhalb des SQL-Server 9.0. Da ich eine Schnittstelle gebaut habe, die von n Clients benutzt werden kann, mache ich mir etwas Sorgen um die Konsistenz.
Da INSERT() und SCOPE_IDENTITY() ja zwei Anweisungen für den Server sind, kann es theoretisch sein, dass eine andere Anwendung meine zuletzt eingefügte ID abholt. (Wir gehen mal davon aus, das die Tabelle nicht gelockt ist.)
In der MSND Lib steht zwar:
Gibt den letzten Identitätswert zurück, der in eine Identitätsspalte im selben Gültigkeitsbereich eingefügt wurde. Ein **Gültigkeitsbereich **ist ein Modul: eine gespeicherte Prozedur, ein Trigger, eine Funktion oder ein Batch. Daher befinden sich zwei Anweisungen im selben Gültigkeitsbereich, wenn sie sich in derselben gespeicherten Prozedur, in derselben Funktion oder im selben Batch befinden.
Stellt sich für mich nun die Frage, ob das auch für eine System.Data.IDbTransaction **gültig **ist?
Viele Grüße
🙂 Torsten
Wobei du deine Frage schon beantwortet hast:
...oder im selben Batch befinden
Somit innerhalb einer Transaktion. Da du mit dem SQL 2005 arbeitest, solltest du dir mal das OUTPUT Statement bei einem INSERT anschauen. Das ist auf jeden Fall transaktionssicher.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
Vielen Dank!
PS: Batch war für mich nicht zwangsläufig eine Transaktion, aber wenn das so definiert ist. Umso besser.
Noch ergänzend dazu gibt es die Variable @@IDENTITY im SQL Server. Im Gegensatz zu SCOPE_IDENTITY() kann es mit der @@ Variable zu Problemen kommen, wenn innerhalb einer SQL Anweisung noch Trigger ausgelöst werden, denn dann liefert @@IDENTITY den letzten Wert der eventuell aus einem Trigger stammt... Deshalb ist auf jeden Fall SCOPE_IDENTITY() vorzuziehen.