[MySQL] row level locking met InnoDB

Pagina: 1
Acties:

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Is het met MySQL mogelijk (i.c.m. InnoDB?) om een row te vergrendelen (select for update bijvoorbeeld?), zodat deze voor andere threads die een select uitvoeren onzichtbaar is?

Dit in verband met een queue die ik in een database wil opslaan, in een multithreaded, multi-server omgeving.
De status van een queue item wordt na toewijzing aan een thread veranderd van "WAITING" naar "ASSIGNED". Omdat het niet mogelijk moet zijn dat twee threads hetzelfde item te pakken krijgen, moet ik dit voorkomen.

Dit kan door:

a) Dit in software te implementeren (een soort van gateway die per thread, gesynchroniseert items toewijst)
b) Dit m.b.v. de database op te lossen, door row-level locking

Ik ben momenteel aan het testen met a), maar gezien de complexiteit van het verhaal, en daarmee de kans op bugs, is b) erg interessant gezien de simpliciteit, als het kan natuurlijk.

Kortom: kan ik rows vergrendelen, zodat ze voor andere threads onzichtbaar zijn, totdat de thread ze weer vrijgeeft, of de thread eindigt ?

  • Femme
  • Registratie: Juni 1999
  • Laatst online: 12:58

Femme

Hardwareconnaisseur

Official Jony Ive fan

[url="http://www.innodb.com/ibman.html#InnoDB_transaction_model"]http://www.innodb.com/ibman.html#InnoDB_transaction_model[/url]

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Die gegevens staan ook (deels) op de MySQL site, had ze al eens gelezen, maar kon niet concreet terugvinden of hetgeen ik zoek nu wel of niet kan.

Zal het morgen eens gaan proberen, en de tekst achter je link eens bekijken. Bedankt!

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Ben het nu aan het testen, en ik zie nu het volgende: Als ik met twee clients verbind, en de volgende queries uitvoer:

client1:
code:
1
2
set autocommit=0;
select * from test order by date limit 1 for update;

client2:
code:
1
2
set autocommit=0;
select * from test order by date limit 1 for update;

dan krijgt client 2 pas een resultset op het moment dat client1 commit. Ik wil eigenlijk dat client2 parallel kan lezen, en gewoon de volgende row terugkrijgt, en niet wacht omdat client1 een lock heeft op de eerste row in zijn resultset.

M.a.w.: ik wil eigenlijk dat client2 alleen rows terugkrijgt die niet vergrendeld zijn.

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Wat ik wil gaat niet, als ik een query uitvoer die sorteert op een kolom, slechts een rij retourneert, en die rij vergrendelt, wordt een andere client -die dezelfde query uitvoert- in de wacht gezet, totdat de eerste client "commit".

Verwijderd

misschien het volgende?

LOCK TABLES tablename

http://www.mysql.com/doc/L/O/LOCK_TABLES.html ?
Pagina: 1