![]() |
Datenbank: MSSQL-Server • Version: 2005 • Zugriff über: ADO
[T-SQL] Locking bzw. Erhalten der Datenkonsistenz
Hallo!
Wie kann ich beim MSSQL-Server während zweier Befehle verhindern, dass zwischen diesen Befehlen ein Befehl einer anderen Anfrage kommt? Beispiel: Ich füge einen Datensatz ein und möchte sofort danach mit "SELECT @@IDENTITY" den letzten Primary Key-Eintrag der Tabelle abfassen. Dazwischen sollte natürlich kein weitere Datensatz eingefügt werden. Leider weiß ich nicht, ob es eine LOCK-Funktion gibt. In der ![]() Eine Möglichkeit ist mir schon eingefallen, allerdings bin ich mir nicht sicher, ob das geht. Kann ich evtl. mein Vorhaben über eine Stored Procedure realisieren? Wird während der Ausführung solch einer Prozedur verhindert, dass andere Befehle dazwischen funken? LG, Xong |
Re: Locking bzw. Erhalten der Datenkonsistenz
Zitat:
je nach dem um was es geht würde ich das in eine Transaktion packen. Zitat:
![]() |
Re: Locking bzw. Erhalten der Datenkonsistenz
Danke für deine Antwort.
Zitat:
Also bei folgendem Statement treten keine Probleme auf? :stupid:
Delphi-Quellcode:
<Query>.Close;
<Query>.SQL.Text := Format( 'INSERT INTO <Tabelle> (<Spalte>) VALUES(%s);' + // INSERT 'SELECT @@IDENTITY AS LASTID;', // Last_Insert_ID [Wert]); <Query>.Open; |
Re: Locking bzw. Erhalten der Datenkonsistenz
@@IDENTITY bezieht sich immer auf deine Session und Transaktion.
@@SCOPE_IDENTITY bezieht sich immer auf dem Scope z.B. innerhalb eine StoredP. @@IDENT_CURRENT bezieht sich auf die letzte Id einer Tabelle |
Re: Locking bzw. Erhalten der Datenkonsistenz
Zitat:
Aber was willst du mir damit sagen? |
Re: Locking bzw. Erhalten der Datenkonsistenz
Das ist die Beschreibung der Funktionen, aber hier ein Beispiel.
Die @@identity ist das was du nutzen kannst.
Code:
linke Spalte Verbindung 1
insert into table1 (x) values (1)
insert into table1 (x) values (1) select @@identity; 2 select SCOPE_IDENTITY() 2 select @@identity; 1 select SCOPE_IDENTITY() 1 select IDENT_CURRENT('Table1'); 2 select IDENT_CURRENT('Table1'); 2 rechte Spalte Verbindung 2 die table1 sieht so aus:
SQL-Code:
CREATE TABLE [Table1] (
[id] [int] IDENTITY (1, 1) NOT NULL , [x] [int] NOT NULL ) ON [PRIMARY] GO |
Re: Locking bzw. Erhalten der Datenkonsistenz
Danke für deine Ausführungen!
Allerdings war mir das so schon klar. :zwinker: Was ich wissen möchte: Kann sich zwischen die INSERT- und die SELECT-Anweisung von Verbindung 1 die INSERT-Anweisung von Verbindung 2 einschleichen? Und als Herausforderung: Wenn nicht, warum nicht? =) Konkretes Beispiel? Bitte:
SQL-Code:
Danke für deine Hilfe.
INSERT INTO <Tabelle> (Foo) VALUES('Bar');
/* <-- Kann hier ein INSERT einer anderen Verbindung eintreten? */ SELECT @@IDENTITY AS LASTID; LG, Xong |
Re: [T-SQL] Locking bzw. Erhalten der Datenkonsistenz
wie die zeitliche Abfolge zeigt in meinen Beispiel ist die Antwort auf deine Kommentarfrage:
JA, aber das verändert NICHT den Inhalt von deiner @@identity in deiner Verbindung. [edit] Ich habe nicht auf warum geantwortet. @@identity bezieht sich nur auf deine Verbindung und wenn du über ADO drauf zu greifst, hast du eine Transaktion drum (ggf. eine automatische) |
Re: [T-SQL] Locking bzw. Erhalten der Datenkonsistenz
Zitat:
Deshalb ein dickes Dankeschön für deine Hilfe! :thumb: :dp: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz