Gleichzeitiger Zugriff auf der DB

deemon84

Mitglied
Hallo,

ich arbeite an einer DB-Applikation und dabei ist das folgende Problem zu lösen.
2 Benutzer (A, B) haben gleichzeitig die Applikation gestartet; nach etwas gesucht und die App zeigt (vereinfacht) folgende Daten an:
Name Qty
---- ---

apple 10
orange 20


Benutzer A ändert 10 auf 15. Nach ca. 1 Minute möchte Benutzer B ebenfalls 10 verändern, jedoch hat B die Suche noch nicht aktualisiert, somit sieht er noch 10.


Frage 1) wie könnte man erreichen, dass in diesem Fall B die Daten (10) nur nach einem Refresh ändern kann? Um die Änderung zu machen verwende ich einen insert-Befehl in einem MS-SQL Server.
Sollte ich bei jedem insert zuerst vergleichen, ob sich die Daten sich inzwischen verändert haben?
Eventuell die DB-Tabellen für bestimmte Zeit sperren, während A damit arbeitet?


Frage 2) Wäre es sinvoll die Tabelle (mit den Suchergebnissen) periodisch zu aktualisieren, damit A und B immer die aktuellste Daten sehen?


Danke,
Daniel
 

mrBrown

Super-Moderator
Mitarbeiter
Zu 1: Nennt sich Optimistic Locking, gäbe im Prinzip 2 Möglichkeiten:
Du führst ein zusätzliches Version-Attribute ein, bei jedem Insert prüfst du erst auf Gleichheit, und incrementierst es dann.
Oder beim ändern werden alle alten Daten mitgeschickt, im Insert wird dann Tabelle mit allen alten Daten verglichen, und bei Gleichheit die neuen Daten geändert.

Zu 2: Nutzerfreundlich wäre das sicherlich ;)
 

Thallius

Top Contributor
Im Endeffekt gibt es aber keine 100% Lösung für das Problem. Du kannst nur versuchen es zu optimieren.

Vor allem wenn du noch Undo dazu programmierst wird es richtig witzig. Stell Dir mal vor User 1 ändert etwas, dann ändert user 2 etwas. User 1 weiß nun nichts davon und macht einen Undo. Nun wird der eigentlich richtige Wert von User 2 wieder gelöscht und es erscheint der alte Wert von User 1. Ganz übel.

Die Lösung mit dem TimeStamp für jedes Attribut ist schon recht gut aber es verlangsamt die Sache natürlich auch ungemein. Du must ja nicht nur pro Datensatz einen TimeStamp haben sondern pro Spalte in der Tabelle. Es kann ja durchauch sein, dass User 1 den Vornamen ändert und User 2 die Strasse. Im optimalen Fall wird beim Ändern der Strasse nun nur die Strasse geupdated und nicht der vorname wieder zurück gesetzt.

Gruß

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
Vor allem wenn du noch Undo dazu programmierst wird es richtig witzig. Stell Dir mal vor User 1 ändert etwas, dann ändert user 2 etwas. User 1 weiß nun nichts davon und macht einen Undo. Nun wird der eigentlich richtige Wert von User 2 wieder gelöscht und es erscheint der alte Wert von User 1. Ganz übel.

Mit Version-Attribute zB hätte man das Problem nicht. Angenommen Änderung von User 1 setzt version auf 1, Änderung von User 2 auf 2. Und von User 1 geht dann von Version 1 aus, und schlägt fehl, weils nicht die aktuelle ist.

Die Lösung mit dem TimeStamp für jedes Attribut ist schon recht gut aber es verlangsamt die Sache natürlich auch ungemein. Du must ja nicht nur pro Datensatz einen TimeStamp haben sondern pro Spalte in der Tabelle. Es kann ja durchauch sein, dass User 1 den Vornamen ändert und User 2 die Strasse. Im optimalen Fall wird beim Ändern der Strasse nun nur die Strasse geupdated und nicht der vorname wieder zurück gesetzt.

Es reicht eine Version/Timestamp pro Tabelle. Die Änderungen von User 2 gehen von invaliden Daten aus, also sind die Änderungen nicht möglich, wäre zumindest für mich gewünschtes Verhalten.
Angenommen Name und Adresse stehen in der DB, passen aber nicht zueinander. User 1 ändert Name so, das Name zur Adresse passt, sind dann also korrekt, User 2 ändert gleichzeitig Adresse, das Adresse zum Namen passt. Ginge das beides durch, ständen falsche Daten in der Datenbank.
 

Thallius

Top Contributor
Es reicht eine Version/Timestamp pro Tabelle. Die Änderungen von User 2 gehen von invaliden Daten aus, also sind die Änderungen nicht möglich, wäre zumindest für mich gewünschtes Verhalten.
Angenommen Name und Adresse stehen in der DB, passen aber nicht zueinander. User 1 ändert Name so, das Name zur Adresse passt, sind dann also korrekt, User 2 ändert gleichzeitig Adresse, das Adresse zum Namen passt. Ginge das beides durch, ständen falsche Daten in der Datenbank.

Das meinte ich mit "Es gibt keine 100% Lösung". Zu jedem Beispiel das Du nennst warum du es so machen willst, kann ich wieder ein Gegenbeispiel bringen warum es anders bessser wäre :)

Gruß

Claus
 

mrBrown

Super-Moderator
Mitarbeiter
in anderen ERP Systemen?

Realistisch ist's in jedem System, in dem mehr als eine Person Daten bearbeiten kann
 

JAVAKEK

Mitglied
Danke für Eure Antworten.
Wie löst man 1) in anderen ERP Systemen? Ist es überhaupt realistisch, dass soetwas vorkommt?

https://help.sap.com/saphelp_nw70/helpdata/de/41/7af4c5a79e11d1950f0000e82de14a/content.htm

Bei dieser Frage wird das SAP-Sperrkonzept für dich interessant sein.

TL;DR: Es gibt eine extra Tabelle die nur dafür gedacht ist Sperren zu verwalten.

und ja, es ist sehr realistisch, dass diseser Fall auftritt. Vorallem, wenn man auf einem System mit meheren hundert Leuten arbeitet und Sperren über mehrere Dialoge und Workflows hinweg erhalten bleiben müssen.
 
Zuletzt bearbeitet:

deemon84

Mitglied
https://help.sap.com/saphelp_nw70/helpdata/de/41/7af4c5a79e11d1950f0000e82de14a/content.htm

Bei dieser Frage wird das SAP-Sperrkonzept für dich interessant sein.

TL;DR: Es gibt eine extra Tabelle die nur dafür gedacht ist Sperren zu verwalten.

und ja, es ist sehr realistisch, dass diseser Fall auftritt. Vorallem, wenn man auf einem System mit meheren hundert Leuten arbeitet und Sperren über mehrere Dialoge und Workflows hinweg erhalten bleiben müssen.

Danke für den Tipp. Dieser scheint recht interessant zu sein. Wahrscheinlich ziemlich aufwendig zu implementieren...
 

mrBrown

Super-Moderator
Mitarbeiter
Man kann es auf verschiedene Arten umsetzen, je nach Nutzung, und wird dann auch unterschiedlich kompliziert.
 

deemon84

Mitglied
Ich habe noch eine Frage bzg. Implementierung. Ich möchte folgendes erreichen:
Code:
QUERY_1_BEGIN
  DECLARE @oldsyncid INTEGER
  SET @oldsyncid = 5  --oldsyncid wird im Java-Code gesetzt
  DECLARE @syncid INTEGER
  SET @syncid = SELECT SYNCID FROM MYTABLE WHERE AWNR=3
 
 
  IF @oldsyncid <> @syncid
  BEGIN
   THROW 51000, 'Daten wurden inzwischen verändert!', 1;
   END
  ELSE
  BEGIN
   UPDATE MYTABLE WITH(ROWLOCK) SET SYNCID = @syncid+1  WHERE AWNR=3
   -- Rest of the Transaction
   END
QUERY_1_END


Sobald "SET @syncid = SELECT ..." ausgeführt wird, möchte ich die entsprechende DB-Zeile sperren, damit solange QUERY_1 läuft, niemand darauf zugreifen kann (weder Lesen, noch Schreiben).
Ich meine, wenn QUERY_2 und QUERY_3 ... abgearbeitet werden, sollen diese auf QUERY_1 warten. (ähnlich, wie ein synchronized{} - Blokk in Java)
Ich habe gelesen, dass beim UPDATE ein ROWLOCK gibt (http://stackoverflow.com/questions/3114826/is-it-possible-to-force-row-level-locking-in-sql-server). Aber ich weiß nicht, ob man soetwas im SQL machen kann.
Die ganze Tabelle möchte ich auch nicht sperren, wenn's möglich ist.
Hat jemand Erfahrung damit?

Danke für Eure Hilfe,
Daniel
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Gleichzeitiger Zugriff auf Datensatz Datenbankprogrammierung 5
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
H MariaDB-Zugriff mittels Java SE Datenbankprogrammierung 3
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
M Datenbank vor unerlaubtem Zugriff durch Benutzer schützen Datenbankprogrammierung 3
L Zugriff auf ein Resultset Datenbankprogrammierung 7
R jdbc-Zugriff Nicht erlaubt ? Datenbankprogrammierung 16
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
D JavaFX Anwendung zugriff auf MySQL DB. Datenbankprogrammierung 2
F Zugriff auf ein bestimmte Row Datenbankprogrammierung 13
S HSQLDB Zugriff auf Access Datenbank Datenbankprogrammierung 0
K MySQL Datenbank 2facher Zugriff Datenbankprogrammierung 1
M DB-Zugriff funktioniert nach JAR-Erstellung nicht mehr Datenbankprogrammierung 3
P Datenbank Zugriff fehlgeschlagen Datenbankprogrammierung 9
B MySQL JDBC Zugriff auf entfernt Datenbank, fehlende Rechte Datenbankprogrammierung 2
L Zugriff auf lokal gespeicherte mySQL Datenbank Datenbankprogrammierung 3
L MySQL App/Java Zugriff auf Mysql-DB funktioniert nicht Datenbankprogrammierung 1
W MySQL -Server Einstellung -- Zugriff übers lokale Netzwerk Datenbankprogrammierung 1
R Oracle jdbc Zugriff auf Oracle Datenbankprogrammierung 2
T Derby/JavaDB Zugriff auf DB mit exportiertem Programm Datenbankprogrammierung 12
A MySQL-Zugriff auf Raspberry Pi Datenbankprogrammierung 2
T PostgreSQL Best Practice: Konkurrierender DB-Zugriff mit meherern Programmen? Datenbankprogrammierung 20
D .mdb Datenbank Zugriff fehlgeschlagen Datenbankprogrammierung 5
B Datenbanken schützen vor Zugriff Datenbankprogrammierung 3
E Zugriff auf MySQL-Datenbank Datenbankprogrammierung 4
K MySQL Zugriff auf Remote-DB verweigert Datenbankprogrammierung 6
G MySQL Zugriff auf Datenbank Objekt Datenbankprogrammierung 19
C Hibernate n:m mittels Zwischentabelle und bidirektionaler Zugriff Datenbankprogrammierung 2
M Zugriff auf mdb via ODBC steuern Datenbankprogrammierung 2
A Zugriff auf DB-Tabellen mit Objekten Datenbankprogrammierung 3
D Was passiert bei absolut zeitgleichem Zugriff auf eine Tablerow Datenbankprogrammierung 7
I Zugriff auf Datenbank nach Erstellen einer Executable Jar Datei verweigert Datenbankprogrammierung 10
I Zugriff auf eine Datenbank auf dem Webserver Datenbankprogrammierung 2
J Derby/JavaDB Zugriff ohne Entwicklungsumgebung Datenbankprogrammierung 5
E H2 - Globalen Zugriff auf die Datenbank? Datenbankprogrammierung 10
J Zugriff auf MySQL-Datenbank Datenbankprogrammierung 5
F Zugriff auf MS Access-Datenbank mit jackcess Datenbankprogrammierung 10
F suche Erstanschub für DB-Zugriff Datenbankprogrammierung 9
E einfache Frage bei DB-Zugriff Datenbankprogrammierung 11
P MySQL Remote Zugriff Datenbankprogrammierung 2
T Problem bei Zugriff auf Access Datenbank Datenbankprogrammierung 7
T MySQL Zugriff ohne Angabe der Datenbank Datenbankprogrammierung 3
M Zugriff auf eine Access-Datenbank innerhalb eines jar-Files Datenbankprogrammierung 7
N Wie kann ich Zugriff auf eine MS Access DB (mit JDBC) über Netzwerk erreichen? Datenbankprogrammierung 7
J Frage zu Synchronisation bei parallelem Zugriff, speziell mit JPA Datenbankprogrammierung 2
T DB Zugriff mit Java Web Datenbankprogrammierung 6
R Zugriff auf SQL im PreparedStatement Datenbankprogrammierung 4
F Zugriff auf MS Access DB Datenbankprogrammierung 3
J Nullpointer Exception bei Zugriff auf Datenbank Datenbankprogrammierung 13
J Zugriff auf Access-Datenbank Datenbankprogrammierung 3
A Zugriff auf Remote MySQL-DB mit JAR-File Datenbankprogrammierung 7
R Java DB Zugriff Datenbankprogrammierung 2
T Zugriff auf Derby-Datenbank will einfach nicht klappen Datenbankprogrammierung 22
G Zugriff auf Datenbank im Internet Datenbankprogrammierung 6
J Java DB Zugriff auf Access (Migration auf andere DB) Datenbankprogrammierung 8
G treiber für datenbank zugriff Datenbankprogrammierung 3
L Datenbank URL Zugriff Datenbankprogrammierung 9
G Wie baut man eine Anwendung mit DB Zugriff Datenbankprogrammierung 3
QDog JPA persistence.xml auslagern/extern Zugriff Datenbankprogrammierung 2
A HSQLDB Performance bei erstem Zugriff Datenbankprogrammierung 6
S Datenbank zugriff optimieren - zugriff ohne cursor? Datenbankprogrammierung 7
A Zugriff auf DB-Pool, der von Servlet initialisiert wurde Datenbankprogrammierung 4
J MYSQL-Zugriff mittels einer Java-Bean Datenbankprogrammierung 42
M mySQL zugriff funktionert nach ca4 stündiger laufzeit nicht Datenbankprogrammierung 6
J Zugriff mit DataSource Datenbankprogrammierung 7
M Zugriff für andere sperren Datenbankprogrammierung 11
K Zugriff mittels JDBC funktioniert nur lokal Datenbankprogrammierung 5
S Zugriff auf eine große Datenmenge von MS Access per JDBC Datenbankprogrammierung 11
G Hibernate Zugriff Datenbankprogrammierung 5
E JDBC Oracle Fehler, zugriff auf datenbank (Cluster) Datenbankprogrammierung 5
D ODBC Zugriff auf MDB-Datenbank, Insert Into ohne Funktion Datenbankprogrammierung 2
T Zugriff auf MS-Access-DB ist grottenlangsam. Normal? Datenbankprogrammierung 9
G Verwendung neuen Treiber für JDBC-Zugriff auf OracleDB Datenbankprogrammierung 5
G Access Zugriff, DB auf Server, Applet Datenbankprogrammierung 4
D Problem beim Zugriff auf eine Oracle-DB Datenbankprogrammierung 23
D Kann nicht auf MySQL Datenbank Zugriff Datenbankprogrammierung 9
G Policy Eintrag für SQL Zugriff im Netzwerk Datenbankprogrammierung 10
S Java SQL-Exception bei Zugriff auf MSAccess Datenbankprogrammierung 2
S JDBC Zugriff auf SQLServer Datenbankprogrammierung 9
D Datenbank zugriff über Client/Server Datenbankprogrammierung 4
M Zugriff auf PostgreSQL mit JAva! Datenbankprogrammierung 7
F Zugriff auf ODBC-Datenbank übers Netzwerk Datenbankprogrammierung 6
G Problem beim Zugriff SQL 2000 Datenbankprogrammierung 2
T Verwaltungsystem mit grafischer Oberfläche mit Zugriff auf. Datenbankprogrammierung 6
C Zugriff auf MS Access Datenbankprogrammierung 4
D Zugriff auf Paradox-Datenbank Datenbankprogrammierung 10
B ResultSet aus Session geladen, aber kein Zugriff möglich Datenbankprogrammierung 6
D HSQLDB Datenbank Zugriff! Datenbankprogrammierung 4
L Programm-Architektur bei DB-Zugriff Datenbankprogrammierung 6
R Zugriff auf MySQL-Datenbank im Internet Datenbankprogrammierung 13
L Zugriff von Applet auf mysql-DB Datenbankprogrammierung 2
K Zugriff auf Access-Datenbank Datenbankprogrammierung 4
R Datenbank zugriff funktioniert nur offline Datenbankprogrammierung 2
G Fehlermeldung beim Zugriff auf SQL-Server-DB Datenbankprogrammierung 3
D Mysql zugriff aus java nicht moeglich Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben