Access sperrt SQL-Server-Tabellen

25/06/2010 - 09:53 von Lutz Uhlmann | Report spam
Hallo NG!

Hoffe hier lesen noch welche ;)

Habe folgendes Problem mit einer Anwendung, bei dem die Auswirkungen
zwar auf dem SQL-Server zu spüren sind, die Ursachen aber evtl im Access
liegen.

Ich greife mit Access 2003 auf einen SQL-Server 2005 zu.

In meinem FE habe ich SQl-Server-Tabellen und -Sichten per ODBC
verknüpft. Seit einigen Tagen passiert es, daß wenn ich einem Formular
einen SELECT zuweise, welcher auf eine verknüpfte Sicht zugreift, daß
dann Tabellen im Server blockiert werden.

Dabei spielt wahrscheinlich folgendes Verhalten eine Rolle.
Das Endlosformular làd die Abfrage. Die scheint insgesamt so
kompliziert, daß Sperren auf dem Server angelegt werden. Offensichtlich
werden es soviele, daß eine LockEscalation eintritt und er gleich die
ganze Tabelle sperrt.
Da Access seinerseits nur einen Teil der Daten auf einmal làd (soviele
wie anzuzeigen sind) bleibt die Verbindung und damit auch die Sperrung
erhalten. Springe ich mit den Navigationspfeilen ans Ende des
Endlosfomulares wird die Sperrung aufgehoben - vermutlich, da nun alle
Daten gelesen sind.


Wir versuchen derzeit verschiedene Maßnahmen auf dem SQL-Server:
- Vereinfachung der Abfragen
- Verbesserung der Indizierung

Was kann ich evtl Access-seitig noch tun?
- Index auf die verknüpfte Sicht??
Haben wir probiert, ist allerdings nicht so leicht, da man keinen
eindeutigen PK in der Abfrage hat. Bei einem Versuch war die Sperrung
weg, allerdings wurde die Anzeige des Formulars langsam und das Formular
fing stàndig an die Anzeige zu refreshen (als würde jemadn stàndig auf
Reload drücken ;)
- kann man irgendwie veranlassen, daß Access alle Daten in einem Rutsch làd?
- umgehen von ODBC?
- anderer Aufruf?

Bzw wie kann ich im SQL-Server den Anforderungen von Access noch
entgegenkommen?

Sind ein bißchen ratlos, da wir derzeit die Fehlerursache nicht 100%
identifizieren können bzw unser Gegenmaßnahmen nur bedingt fruchten.

Die Software lief über ein Jahr ohne Probleme - bis Mittwoch ;)

Lutz



P.S. Ein Beispiel

Formularquelle:
SELECT * FROM a_stoerung9 WHERE ID > 0 AND AUFNAHME IN (1009,1027,2110)
ORDER BY MELDUNGAM DESC, PRIO

a_stoerung9 ist eine verknüpfte SQL-Server-Sicht:
SELECT schAnl.DB_PASSWD.NUTZ AS AUFTRAGVON,
schAnl.a_auftrag_kz_hand.NDATE AS AUFTRAGAM,
schAnl.a_auftrag_kz_hand.AUFUSER AS AUFNAHME,
schStoer.DB_STOERUNG.MELDUNGVON, schStoer.DB_STOERUNG.MELDUNGAM,
schStoer.DB_STOERUNG.MANGEL, schAnl.DB_ANGEBOT.NR,
schAnl.DB_ANGEBOT.STO_ID, schAnl.DB_ANGEBOT.ANL_TYP,
schAnl.DB_ANGEBOT.KON_ID, schAnl.DB_ANGEBOT.BEMERKUNG,
schAnl.DB_ANGEBOT.MASS_ID, schAnl.DB_ANGEBOT.ZUSTAND,
schAnl.DB_ANGEBOT.AENDE, CAST(schStoer.DB_STOERUNG.KENNER AS NVARCHAR) +
CAST(schStoer.DB_STOERUNG.ZAEHLER AS NVARCHAR) +
CAST(schAnl.DB_ANGEBOT.NR AS NVARCHAR) AS NUMMER,
schAnl.a_auftrag_kz_hand.PRIO, schAnl.a_auftrag_kz_hand.AUFKZ, 0 AS
ERLSTO, schAnl.DB_TERMARC.AUF_ID, schAnl.DB_TERMARC.PRUSCHL_ID,
schAnl.DB_TERMARC.FIRMA, schAnl.a_anlagen_alle.ID,
schAnl.a_anlagen_alle.TYP, schAnl.a_anlagen_alle.NUMMER AS SCHL,
schAnl.a_anlagen_alle.BEZ, schAnl.a_anlagen_alle.KEN,
schAnl.a_anlagen_alle.STANDORT, schAnl.a_anlagen_alle.ORT,
schAnl.a_anlagen_alle.B10, schAnl.a_anlagen_alle.STAMMNR,
schAnl.a_anlagen_alle.WPA
FROM schStoer.DB_STOERUNG INNER JOIN
schAnl.DB_ANGEBOT ON schStoer.DB_STOERUNG.ID =
schAnl.DB_ANGEBOT.STO_ID INNER JOIN
schAnl.a_auftrag_kz_hand ON schAnl.DB_ANGEBOT.AUF_ID =
schAnl.a_auftrag_kz_hand.ID INNER JOIN
schAnl.DB_TERMARC ON schAnl.a_auftrag_kz_hand.ID =
schAnl.DB_TERMARC.AUF_ID INNER JOIN
schAnl.a_anlagen_alle ON schAnl.DB_TERMARC.ID =
schAnl.a_anlagen_alle.ID LEFT OUTER JOIN
schAnl.DB_PASSWD ON schAnl.a_auftrag_kz_hand.AUFUSER =
schAnl.DB_PASSWD.ID
WHERE (schAnl.DB_ANGEBOT.AENDE > DATEADD(month, - 2, GETDATE()))
 

Lesen sie die antworten

#1 Josef Poetzl
25/06/2010 - 10:28 | Warnen spam
Hallo!

Lutz Uhlmann schrieb:
Hoffe hier lesen noch welche ;)



Du könntest als Alternative de.comp.datenbanken.ms-access verwenden.

In meinem FE habe ich SQl-Server-Tabellen und -Sichten per ODBC
verknüpft. Seit einigen Tagen passiert es, daß wenn ich einem Formular
einen SELECT zuweise, welcher auf eine verknüpfte Sicht zugreift, daß
dann Tabellen im Server blockiert werden.



Ich hatte das Problem auch einmal bei einer einzigen Sicht oder Prozedur
(bin mir nicht mehr sicher). Es war aber auch eine relativ umfangreiche
SQL-Anweisung mit vielen Tabellen.
Sobald diese Sicht in einem Access-Formular (nur lesend) geöffnet wurde,
wurden die Datensàtze aus einer in der Sicht verwendeten Tabelle
gesperrt.
Meine Problemumgehung war ein /WITH (NOLOCK)/ bei der einen Tabelle in
der From-Teil der SQL-Anweisung.

SELECT
...
FROM
TABELLE WITH (NOLOCK)
INNER JOIN
TABELLE2
ON ...


mfg
Josef

Code-Bibliothek für Access-Entwickler: http://access-codelib.net/
Access-FAQ von Karl Donaubauer: http://www.donkarl.com/

Ähnliche fragen