![]() |
Datenbank: SQL Server • Version: 2000/2005/2008 • Zugriff über: ADO
ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
Hallo zusammen,
habe ein Projekt mit etwa 120 Tabellen zu Betreuen. Wir verbinden uns via ADO auf die Datenbank. Da im Programm Transaktionen verwenden, kommt es mitlerweile zu sehr vielen Timeouts, da verschiedenste Locks auf den Datensätzen liegen. Mit der Software arbeiten momentan maximal gleichzeitig 30 Leute auf einer Datenbank (Entweder SQL Server 2000 oder 2005, teilweise schon 2008). Nun ist es mein Ziel, die Timeouts zu entfernen. Der ADO-Provider ist: Microsoft OLE DB Provider for SQL Server (dieser darf nicht geändert werden, er muss so bleiben!!!) Momentan verwende ich folgende Einstellungen für die ADOConnection: Code:
Delphi-Quellcode:
Die Transaktionen werden wie folgt gestartet:
TAdoConnection(DB).Attributes := [xaCommitRetaining, xaAbortRetaining];
TAdoConnection(DB).IsolationLevel := ilReadUncommitted; TAdoConnection(DB).LoginPrompt := False; TAdoConnection(DB).ConnectionTimeout := 30; TAdoConnection(DB).CommandTimeOut := 0; TAdoConnection(DB).Connected := True;
Delphi-Quellcode:
Sie werden so commited:
TAdoConnection(DB).BeginTrans;
Delphi-Quellcode:
So läuft der Rollback:
TAdoConnection(DB).CommitTrans;
Delphi-Quellcode:
So läuft die Überprüfung, ob eine Transaktion gestartet ist
TAdoConnection(DB).RollbackTrans;
Delphi-Quellcode:
Die Transaktionen werden immer so kurz wie möglich und so lang wie nötig offen gehalten. Leider kann es aber vorkommen, dass eine Nutzer halt einen Kaffee trinken gehen und somit eine Transaktion geöffnet bleibt (Das alte Leiden halt).
result := TAdoConnection(DB).InTransaction;
Nun meine Frage: Welche Einstellungen, sollten für einen Mehrbenutzer-Betrieb einer SQL Server Datenbank mit Transaktionsnutzung, für die ADO-Connnection gelten? Wie sollten die Transaktionen gestartet und beendet werden? Was ist allgemein im Mehrbenutzerbetrieb mit ADO zu beachten? Es gibt viele Indizies auf den einzelnen Tabellen, haben diese damit was zu tun? Vielen Dank für eure Mithilfe. |
Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
Delphi-Quellcode:
"Read Uncommitted" als Transaktionslevel ist eigenartig:
TAdoConnection(DB).Attributes := [xaCommitRetaining, xaAbortRetaining];
[b]TAdoConnection(DB).IsolationLevel := ilReadUncommitted;[/b] TAdoConnection(DB).LoginPrompt := False; TAdoConnection(DB).ConnectionTimeout := 30; TAdoConnection(DB).CommandTimeOut := 0; TAdoConnection(DB).Connected := True; Zitat:
|
Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
Zitat:
Wäre ein anderes Transaktionslevel sinnvoller? |
Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
Zitat:
|
Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
AFAIK unterstützen neuere MS SQL Sersionen das
![]() |
Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
Zitat:
|
Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
Was mich verwundert, ist die Länge einer "offenen Transaktion". Ich weiss ja nun nicht wie genau die Architektur deiner Anwendung ist, jedoch ists bei uns so, dass für jede Aktion (Insert, Update, Delete eines Records oder einer Liste von Records) eine eigene Transaktion gestartet wird, die Transaktion also nur für den tatsächlichen Datenbankzugriff offen ist und danach committed wird oder im Fehlerfall eben ge-rollback-t wird.
Deshalb haben wir kein "ReadUncommitted", eine Userzahl von ca. 600-1000 Anwender weltweit auf einem DB-Server und ein verteilte Architektur mit MiddleWare-Server. |
Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
Kleines Beispiel:
Nutzer 1: Wir starten eine Fakturierung zur Rechnungserzeugung (StartTransaction). Diese Fakturierung erzeugt die Rechnung, die Rechnungspostionen, etc. Dieser Lauf dauert bei uns etwa 5 - 30 Minuten. Nun kann der Anwender zwischendurch die Sache komplett abbrechen. Beim Abbruch sollte somit ein Rollback ausgeführt werden. Wenn nicht ein Commit. Da wir in der Transaktion "Select"-Abfragen auf andere Tabellen fahren (z.B. um Artikel, Faktor und Texte zu ermitteln) kommt es somit zu Speeren auf anderen Tabellen (z.b. Tabelle Artikel). Nutzer 2: Wenn nun ein anderer Nutzer allerdings z.b. Einen Druck aller Arikel durchführt bekommt dieser eine Speeranforderung vom SQL Server, da alle Datensätze durch die geöffnete Transaktion von Nutzer 1 gesppert sind. Wie kann ich dieses besser umgehen? |
Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
Hallo,
ein Hoch auf MGA bei Firebird ... ;) So, nun im Ernst. Verwende so oft wie möglich With NoLock ![]() Ab wann es das beim MS-SQL gibt, musst du noch herausfinden. Heiko |
Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
With No Lock gibt es unterm SQL Server.
Allerdings müssen dann ca. 5000 Querys von mir geändert werden... :wall: Da freue ich mich jetzt schon drauf... Naja gibt es sonst vielleicht eine andere Möglichkeit die Sperren zu verhindern? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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