AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server
Thema durchsuchen
Ansicht
Themen-Optionen

ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

Ein Thema von sega84 · begonnen am 20. Mai 2009 · letzter Beitrag vom 20. Mai 2009
Antwort Antwort
Seite 1 von 2  1 2      
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#1

ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 07:50
Datenbank: SQL Server • Version: 2000/2005/2008 • Zugriff über: ADO
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:
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;
Die Transaktionen werden wie folgt gestartet:
TAdoConnection(DB).BeginTrans; Sie werden so commited:
TAdoConnection(DB).CommitTrans; So läuft der Rollback:
TAdoConnection(DB).RollbackTrans; So läuft die Überprüfung, ob eine Transaktion gestartet ist
result := TAdoConnection(DB).InTransaction; 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).

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.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 07:57
Delphi-Quellcode:
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;
"Read Uncommitted" als Transaktionslevel ist eigenartig:

Zitat:
When this option is set, it is possible to read uncommitted or dirty data; values in the data can be changed and rows can appear or disappear in the data set before the end of the transaction.
http://msdn.microsoft.com/en-us/library/aa259216(SQL.80).aspx
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#3

Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 08:00
Zitat:
"Read Uncommitted" als Transaktionslevel ist eigenartig:
Das stimmt leider. Das Problem liegt daran, dass trotz einer geöffneten Transaktion ein anderer Benutzer auf den Datensatz zugreifen muss. Natürlich kenne ich bereits das Dirty-Read Problem, nur kann ich es leider nicht umgehen.
Wäre ein anderes Transaktionslevel sinnvoller?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#4

Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 08:41
Zitat von sega84:
Zitat:
"Read Uncommitted" als Transaktionslevel ist eigenartig:
Das stimmt leider. Das Problem liegt daran, dass trotz einer geöffneten Transaktion ein anderer Benutzer auf den Datensatz zugreifen muss. Natürlich kenne ich bereits das Dirty-Read Problem, nur kann ich es leider nicht umgehen.
Wäre ein anderes Transaktionslevel sinnvoller?
Wenn Read Uncommitted verwendet merden muss, kann man natürlich nichst machen. Wir verwenden in einer ähnlichen Umgebung Read Committed. Auch damit kann man ja auf Datensätze zugreifen, die in einer anderen Transaktion verwendet werden. (Man sieht aber im Unterschied zu Read Uncommitted nur die Datenfeldwerte, die committed wurden.)
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 09:07
AFAIK unterstützen neuere MS SQL Sersionen das Multiversionskonzept so das Deadlocks bei weiten weniger häufiger Auftreten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#6

Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 09:07
Zitat von mjustin:
Wir verwenden in einer ähnlichen Umgebung Read Committed. Auch damit kann man ja auf Datensätze zugreifen, die in einer anderen Transaktion verwendet werden. (Man sieht aber im Unterschied zu Read Uncommitted nur die Datenfeldwerte, die committed wurden.)
Werde es mal ausprobieren. Wie arbeitet Ihr mit Transaktionen? Wann und wie startet ihr diese?
  Mit Zitat antworten Zitat
Benutzerbild von iKilledKenny
iKilledKenny

Registriert seit: 25. Apr 2007
Ort: Bergstrasse
49 Beiträge
 
Delphi 5 Professional
 
#7

Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 09:12
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.
Alexander Stork
  Mit Zitat antworten Zitat
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#8

Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 09:23
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?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 09:31
Hallo,

ein Hoch auf MGA bei Firebird ...

So, nun im Ernst.

Verwende so oft wie möglich With NoLock
NoLock

Ab wann es das beim MS-SQL gibt, musst du noch herausfinden.


Heiko
Heiko
  Mit Zitat antworten Zitat
sega84

Registriert seit: 18. Sep 2006
73 Beiträge
 
Delphi XE2 Professional
 
#10

Re: ADO + Mehrbenutzerbetrieb + Transaktionen + SQL Server

  Alt 20. Mai 2009, 09:34
With No Lock gibt es unterm SQL Server.
Allerdings müssen dann ca. 5000 Querys von mir geändert werden... Da freue ich mich jetzt schon drauf...
Naja gibt es sonst vielleicht eine andere Möglichkeit die Sperren zu verhindern?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:58 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