phpbar.de logo

Mailinglisten-Archive

Datenbankdesign? OT?

Datenbankdesign? OT?

Oliver Six mysql_(at)_lists.phpcenter.de
Thu, 19 Jul 2001 10:42:08 +0200


Michael Bergbauer <michael_(at)_noname.franken.de> wrote on 18.07.01 
19:52:04: 

>
>On 18-Jul-2001 Ulrich Scheuermann wrote:
>> 
>> ----- Original Message -----
>> From: "Michael Bergbauer" <michael_(at)_noname.franken.de>
>> To: <mysql-de_(at)_lists.4t2.com>
>> Sent: Wednesday, July 18, 2001 6:06 PM
>> Subject: Re: Re: Datenbankdesign? OT?
>> 
>> 
>>>
>>> Ja. Ohne das du deine Abfragen hier postest, wirst du aber wohl 
>>> keinen 
>> besseren
>>> Rat hören.
>>>
>>>
>>> Was verstehst du unter verschachtelten Queries?
>>>
>> 
>> Hallo  Michael, hallo Liste,
>> 
>> Aus dem Startformular meiner Access-Anwendung wird per Schaltfläche 
>> eine Ereignisprozedur ausgeführt:
>> 
>>     DoCmd.RunSQL "UPDATE qry100OP selektieren
>>         SET qry100OP selektieren.MA Nr = intMaNr;"
>> 
>> Die Abfrage "qry100OP selektieren" lautet:
>>         SELECT TOP 100 tblKontakte.MA Nr
>>         FROM tblKontakte
>>         WHERE ...;
>> 
>> Also: eine Auswahlabfrage, die von einem SQL-String aktualisiert 
>> wird. 
>
>Hmm, nachdem es in MySQL keine StoredQueries/Views/oä gibt würd ich 
>fast sagen, an der ganzen Misere ist Access schuld. Auch das "Select 
>TOP 100" ist in MySQL nicht möglich. Die ganze DB-Operation wird also 
>von Access und nicht MySQL gemacht, du solltest daher auch bei der 
>Access-Liste besser aufgehoben sein. 
>
>Die MySQL-Lösung des Problems wurde hier schon mehrmals vorgeschlagen, 
>ich wiederhols aber gerne nochmal:
>
>entweder arbeitest du mit Lock/unlock table, oder mit create locks 
>(ich hoffe die Dinger heissen so,  bin immer noch zu faul zum 
>nachschlagen), um das ganze zu serialiseren, oder du machst die UPDATE-
>Abfrage vor der Select-Abfrage, dann solltest du sichergehen können, 
>das die Leute verschiedene Datensätze bekommen. 
>
>
>
>Michael
>
>-- 
>Michael Bergbauer <michael_(at)_noname.franke.de>
>Use your idle CPU cycles.
>See http://www.distributed.net and win $ 1 000.
>Visit our mud Geas at geas.franken.de Port 3333
>
>---
>!!NEU!!
>Fragen und Antworten zu MySQL und dieser Liste unter
>-->>  http://www.4t2.com/mysql

Hi,

falls ich auch noch meinen Senf dazugeben darf: Ein "SELECT TOP x" 
laesst sich fuer MySQL relativ einfach mit einem "LIMIT x" am Ende der 
Query ausdruecken. 

Fuer die Serialisierung der Datenzugriffe stehen unter MySQL 
prinzipiell zwei Varianten zur Verfuegung. Entweder sperrt man die 
Tabellen ganz hart mit einem "LOCK TABLES" oder man arbeitet mit 
kooperativen Sperren via "GETLOCK()". Beide Varianten haben den 
Nachteil, das die Sperre 24h stehenbleibt, wenn der Client abstuerzen 
sollte (... was die M$-Sachen ja gerne tun). Deshalb sollte die 
Sperrzeit so kurz moeglich sein. 

Eine harte Sperre via "LOCK TABLES" sperrt dann die Tabelle fuer alle 
Clients. Das arbeitet genau gegen den Multithreading-Ansatz des MySQL 
und kostet also extrem Performance. Ich fuer meinen Teil versuche 
deswegen, nur dann, wenn unbedingt noetig, harte Sperren einzusetzen. 

Um die Sperrzeit kurz zu halten, benutze ich im Normalfall eine von der 
restlichen Datenbank unabhaengige Tabelle, die nur die aktuell 
gesperrten Datensaetze (Will heissen: ID, Tabelle, Datensatznummer und 
Sperrzeitpunkt) enthaelt. Alle schreibenden Zugriffe auf diese Tabelle 
werden dann mittels "GETLOCK()" serialisiert. 

Hat ein Client dann den exklusiven Zugriff auf diese Sperrentabelle, 
loescht er als erstes alle Sperren, die aelter sind als z.B. 5 min. 
(damit fange ich die abgestuerzten Clients auf). Dann prueft der 
Client, ob der Datensatz, den er gerne bearbeiten moechte, in der 
Sperrtabelle eingetragen ist. Wenn nicht, traegt er genau diesen 
Datensatz mit der aktuellen Zeit (NOW()) in der Sperrentabelle ein und 
"merkt" sich die Datensatznummer des Sperrdatensatzes, damit er seine 
Sperren alle 3 min. aktualisieren kann. Nach der Bearbeitung entfernt 
er dann diesen Sperrdatensatz, so dass wieder alle damit arbeiten 
koennen. 

Dieser Algorithmus sollte sich mit maximal 200 Zeilen VBA ausdruecken 
lassen und hat sich (bis jetzt) als relativ wasserdicht herausgestellt. 

Ciao Oliver

---
!!NEU!!
Fragen und Antworten zu MySQL und dieser Liste unter
-->>  http://www.4t2.com/mysql 



php::bar PHP Wiki   -   Listenarchive