# Multi User Datenbank Anwendung



## dbausnnd (8. Nov 2016)

Hallo,

ich arbeite mit unterschiedlichen Datenbanken (MSSQl Oracle Db2). Regelmäßig stehe ich bei eine Multi User Anwendung vor der Problematik des konkurrierenden Zugriff (Update) auf Daten von unterschiedlichen Benutzern. Bislang habe ich das immer mit einem Lock-Feld gelöst. Finde diese Lösung aber nicht optimal, da das Lock durchaus stehen bleiben kann und die Lösung auch nicht zu 100% sicher ist.

Mich würde interessieren wie Ihr dies Problematik löst?

Gruß

dbausnnd


----------



## Thallius (8. Nov 2016)

Das ist doch total abhängig von der Anwendung. Warum sollt ich eine DB komplett sperren nur weil gerade jemand einen neuen Kunden anlegt. Während dessen kann ja ein anderer durchaus ein neues Produkt anlegen oder Artikel anzahlen im Lager ändern....


----------



## Dukel (8. Nov 2016)

Überlasse das doch der DB. Diese hat eigene Mechanismen. Du musst nur definieren, wie weit die Locks gehen dürfen.
https://technet.microsoft.com/en-us/library/ms175519(v=sql.105).aspx
https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9015.htm


----------



## mrBrown (9. Nov 2016)

Ich denke mal, er meint nicht Locking innerhalb einer Transaktion, sondern eher Sperren eines Datensatzes für andere Nutzer. 
Beispiel Nutzer A öffnet Datensatz X zum bearbeiten, dann kann Nutzer B ihn anzeigen, aber nicht auch bearbeiten. Da 'nen exklusiven Lock drauf legen ginge zwar, sperrt den Datensatz aber ganz für einige Minuten.

Das Thema gabs hier vor längerem schon mal, uU ist das hier interessant: https://help.sap.com/saphelp_nw70/helpdata/de/41/7af4c5a79e11d1950f0000e82de14a/content.htm


----------



## tommysenf (9. Nov 2016)

Was du machst nennt sich pessimistic locking. Eine Alternative dazu ist das optimistic locking. Dabei gibst du dem Datensatz statt eines Lock-Feldes ein Versionsfeld, welches du bei jedem update hochzählst. Vor dem speichern prüfst du nun ob die Version des zu speichernden Datensatzes mit der Version des aktuell in der DB befindlichen Datensatzes übereinstimmt. Ist das nicht der Fall, wurde der Datensatz in der Zwischenzeit geändert und du gibst dem Benutzer eine Fehlermeldung.



Thallius hat gesagt.:


> Das ist doch total abhängig von der Anwendung. Warum sollt ich eine DB komplett sperren nur weil gerade jemand einen neuen Kunden anlegt.


@Thallius
Er sperrt ja nie die komplette DB sondern nur den entsprechenden Datensatz.


----------



## dbausnnd (9. Nov 2016)

Vielen Dank für die vielen Kommentare. Den Ansatz mit einer Versionsnummer oder der Berechnung eines Hashwertes werde ich mir mal ansehen.


----------

