Mailinglisten-Archive |
Hi, Joerg Krause: > 1. Ansatz: > Schreibvorgänge niedriger priorisieren: > set SQL_LOW_PRIORITY_UPDATES=1 > oder > INSERT LOW_PRIORITY > Dann haben die SELECTs immer Vorrang, was zumindest etwas > das Gleichzeitigkeitsproblem löst. Hilft in diesem Fall aber überhaupt nichts. > 2. Ansatz > Tabelle LOCKen (aus Handbuch): > 3. Ansatz > Lasse die gleichzeitige Eintragung zu und räume die DB > ab und zu auf. Ich mache solche Garbage Collection mit einem > Skript, das etwa alle 50 Aufrufe mal anspringt (per random). > Das funktioniert aber nicht immer. Beispielsweise wenn was geupdatet werden muß. 4. Ansatz: Darauf warten, dass MySQL endlich Stored Procedures kriegt. Das passiert bestimmt noch dieses Jahr... 5. Ansatz: Eigenes Lock einführen. mysql> select GET_LOCK('CUST_$some_id',99) wenn == 0: DEADLOCK melden, beenden > mysql> select sum(value) from trans where customer_id= some_id; > mysql> update customer set total_value=sum_from_previous_statement > where customer_id=some_id; mysql> select RELEASE_LOCK('CUST_$some_id') $some_id ist dabei natürlich die ID des zu schützenden customer-Records. In Perl (mit meinem persönlichen Datenbank-Interfacecode) sieht das dann so aus: DoLocked { my $sum = DoFn("select sum(value) from trans where customer_id=$id"); Do("update customer set total_value=$sum where customer_id=$id"); } "CUST_$id"; "DoLocked" ist dabei dieser Code: sub DoLocked (&$;$) { my($job,$lock,$timeout) = _(at)__; $timeout ||= 99; my($res,_(at)_res); $lock = Quote($lock); DoFn("select GET_LOCK('$lock',$timeout)") or die("Deadlock '$lock'"; if(wantarray) { _(at)_res = &$job; } else { $res = &$job; } DoFn("select RELEASE_LOCK('$lock')"); wantarray ? _(at)_res : $res; } Simpler geht es nicht. -- Matthias Urlichs | noris network GmbH | smurf_(at)_noris.de | ICQ: 20193661 The quote was selected randomly. Really. | http://www.noris.de/~smurf/ -- Bill Watterson, cartoonist: "Sometimes I think the surest sign that intelligent life exists elsewhere in the universe is that none of it has tried to contact us." --- *** Abmelden von dieser Mailingliste funktioniert per E-Mail *** an mysql-de-request_(at)_lists.4t2.com mit Betreff/Subject: unsubscribe
php::bar PHP Wiki - Listenarchive