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