Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit Transaktionen und MS-SQL-Server 2000 und Delphi (https://www.delphipraxis.net/11367-probleme-mit-transaktionen-und-ms-sql-server-2000-und-delphi.html)

Der Bernd 5. Nov 2003 10:50


Probleme mit Transaktionen und MS-SQL-Server 2000 und Delphi
 
Probleme mit Transaktionen mit MS-SQL-Server 2000 und Delphi und BDE-ODBC

Allgemeines :
- Es handelt sich um eine bestehende sehr große Anwendung die bisher unter
Adaptive Server Anywhere 8 läuft und nun zusätzlich auf MS-SQL-Server 2000 laufen soll.

- Es werden ausschließlich Borland-Delphi-BDE-Komponenten verwendet.
(TDatabse,TTable,TQuery)

Hier ein Minimal-Beispiel mit dem ich bei mir zu 100% einen Deadlock produzieren kann.

try
Database.StartTransaction;

Query1.SQL.Clear;
Query1.SQL.Add('Update Kunden Set Status = 2 Where ID = 1234');
Query1.ExecSQL;

Query2.SQL.Clear;
Query2.SQL.Add('Select * from Artikel Where ID = 1122'); // Artikel ist eine Tabelle mit 200 Spalten
Query2.Open;

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('Select KundenNr from Kunden Where ID = 1234');
Query1.Open;
// Hier bleibt das Programm bzw. die Datenbank hängen !!!!!!!!!!!!

Database.Commit;
except
Database.Rollback;
end;

Dieses Beispiel ist nur eine extreme Vereinfachung des realen Ablaufes in meinem Programm,
also bitte nicht unnötig über den Sinn nachdenken.

Was der Profiler anzeigt :

SQL:BatchStarting : SET TRANSACTION ISOLATION LEVEL READ COMMITTED auf SPID 51
SQL:BatchStarting : set implicit_transactions on auf SPID 51
SQL:BatchStarting : Update Kunden Set Status = 2 Where ID = 1234 auf SPID 51
SQL:BatchStarting : Select * from Artikel Where ID = 1122 auf SPID 51
. Diverse Lock:Acquired und Lock:Released
.
SQL:BatchStarting : set implicit_transactions on auf SPID 53
SQL:BatchStarting : Select KundenNr from Kunden Where ID = 1234 auf SPID 53
Lock:Acquired: auf SPID53
Lock:Acquired: auf SPID53
Lock:Acquired:auf SPID53
Lock:Acquired:auf SPID53
Lock:TimeOut:auf SPID53


Wenn ich :
- Query2 durch Query1 ersetze, dann funktioniert es.
- Bei der Query2-Abfrage auf eine kleine Tabelle mit 15 Spalten gehe funktioniert es.

Warum kein ADO ? Umstellungsaufwand ist viel zu groß, auch ASA8 muß weiterhin funktionieren.
Warum keine StoredProcedure ? Transaktion ist viel zu Komplex.

Ich habe gelesen das der SQL-Server eine neue SPID anlegt, wenn eine Operation zu lange dauert,
aber er kann doch nicht innerhalb einer Transaktion auf einmal eine neue Leitung aufmachen die
nichts von der laufenden Transaktion weiß und diese auch noch blockieren.

Wo ist mein Fehler ????[cl][dp][/cl][df][google]

Leuselator 7. Nov 2003 07:22

Re: Probleme mit Transaktionen und MS-SQL-Server 2000 und De
 
nur so im Dunkeln herumstochert:

warum das Comit nicht dirket nach dem Update? Ich vermute es hakt, weil Du nach dem Update ohne zu comitten direkt ein select folgen lässt...
Gruß

Der Bernd 7. Nov 2003 09:40

Re: Probleme mit Transaktionen und MS-SQL-Server 2000 und De
 
Wie gesagt das ist nur ein minimal Beispiel ohne wirklichen Sinn.

In Realen Programm kommen danach natürlich noch weitere Updates/Inserts/Selects die
aber alle noch innerhalb der Transaktion ablaufen müßen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:41 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