AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi [T-SQL] Locking bzw. Erhalten der Datenkonsistenz
Thema durchsuchen
Ansicht
Themen-Optionen

[T-SQL] Locking bzw. Erhalten der Datenkonsistenz

Ein Thema von Xong · begonnen am 22. Feb 2008 · letzter Beitrag vom 22. Feb 2008
Antwort Antwort
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#1

[T-SQL] Locking bzw. Erhalten der Datenkonsistenz

  Alt 22. Feb 2008, 10:10
Datenbank: MSSQL-Server • Version: 2005 • Zugriff über: ADO
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 T-SQL-Referenz von Microsoft habe ich jedenfalls nichts gefunden (bzw. war zu blöd zum Suchen).

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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Locking bzw. Erhalten der Datenkonsistenz

  Alt 22. Feb 2008, 10:53
Zitat von Xong:
Hallo!
Wie kann ich beim MSSQL-Server während zweier Befehle verhindern, dass zwischen diesen Befehlen ein Befehl einer anderen Anfrage kommt?
Hai Xong,

je nach dem um was es geht würde ich das in eine Transaktion packen.

Zitat:
...Eine Möglichkeit ist mir schon eingefallen, allerdings bin ich mir nicht sicher, ob das geht.
Klick mich mal an.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Locking bzw. Erhalten der Datenkonsistenz

  Alt 22. Feb 2008, 11:44
Danke für deine Antwort.
Zitat von Sharky:
je nach dem um was es geht würde ich das in eine Transaktion packen.
Öhm... Das geht?
Also bei folgendem Statement treten keine Probleme auf?
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;
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#4

Re: Locking bzw. Erhalten der Datenkonsistenz

  Alt 22. Feb 2008, 12:01
@@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
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Locking bzw. Erhalten der Datenkonsistenz

  Alt 22. Feb 2008, 12:05
Zitat von generic:
@@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
Ich weiß.
Aber was willst du mir damit sagen?
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Locking bzw. Erhalten der Datenkonsistenz

  Alt 22. Feb 2008, 12:11
Das ist die Beschreibung der Funktionen, aber hier ein Beispiel.
Die @@identity ist das was du nutzen kannst.
Code:
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
linke Spalte Verbindung 1
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
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Locking bzw. Erhalten der Datenkonsistenz

  Alt 22. Feb 2008, 12:18
Danke für deine Ausführungen!

Allerdings war mir das so schon klar.

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:
INSERT INTO <Tabelle> (Foo) VALUES('Bar');
/* <-- Kann hier ein INSERT einer anderen Verbindung eintreten? */
SELECT @@IDENTITY AS LASTID;
Danke für deine Hilfe.

LG,
Xong
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#8

Re: [T-SQL] Locking bzw. Erhalten der Datenkonsistenz

  Alt 22. Feb 2008, 12:33
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)
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Xong
Xong

Registriert seit: 9. Jan 2008
186 Beiträge
 
Delphi 2006 Professional
 
#9

Re: [T-SQL] Locking bzw. Erhalten der Datenkonsistenz

  Alt 22. Feb 2008, 12:43
Zitat von generic:
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.
Ja, ist mir auch grad klar geworden. Ich überlese gerne Vieles und muss mich zwingen nichts zu überstürzen. Das klappt nur manchmal eben nicht.
Deshalb ein dickes Dankeschön für deine Hilfe!

  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz