Toon posts:

[MySQL] Gegevens invoeren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Kan ik er bij MySQL ervan op aan dat de verzoeken tot schrijven in de database exact na elkaar worden afgewerkt?

Ik bedoel hiermee dat wanneer gebruiker 1 gegevens wegschrijft via een PHP-script, gebruiker 2´s verzoek om gegevens weg te schrijven in de wachtrij wordt gezet.

Dit moet ik nm. wel zeker weten aangezien ik met een relationeel database-model wil gaan werken en de id´s dus moeten kloppen!

Met vr.. onee dat mag hier niet hè? :*)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Doe eens [google=mysql transaction]. Als je nog nooit van een transaction hebt gehoord trouwens zou ik eens heel snel een goed boek over databases gaan kopen als ik jou was.

Professionele website nodig?


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
hmm....waarom zou ie naar transactions moeten gaan zoeken? volgens mij heeft dat weinig met z'n vraag te maken.

op het moment dat gebruiker 1 iets wegschrijft in tabel A en op dat moment (een fractie later) wil gebruiker 2 ook iets wegschrijven, dan wordt die inderdaad in een soort 'wachtrij' gezet. gebruiker 1 veroorzaakt namelijk een schrijf-lock op tabel A, waardoor ie even ontoegankelijk wordt voor iedereen behalve gebruiker 1
Dit moet ik nm. wel zeker weten aangezien ik met een relationeel database-model wil gaan werken en de id´s dus moeten kloppen!
zou je dat nog iets kunnen toelichten (met die id's), want ik snap niet precies wat dat met je probleem te maken heeft

[ Voor 26% gewijzigd door marty op 28-08-2003 19:13 ]


  • DanceTrend
  • Registratie: Maart 2001
  • Laatst online: 12-05 14:34

DanceTrend

w0ei

Hmm als ik het goed begrijp (ALS :P) dan bedoelt ie zoiets van:

Als je bijv. auto_increment hebt, en 2 users voegen PRECIES op hetzelfde moment iets doe aan de database, krijgt 1 van die 2 dan een foutmelding? Of wordt er iemand in een wachtrij geplaatst tot dat de ander klaar is?

Zoiets? :P

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

marty schreef op 28 August 2003 @ 19:11:
hmm....waarom zou ie naar transactions moeten gaan zoeken? volgens mij heeft dat weinig met z'n vraag te maken.
LOL als ik idd te moeilijk denk is het wel een heel basic vraag. Natuurlijk serializeert een DB-server alle updates, tis immers onmogelijk om die verantwoordelijkheid bij 0..* clients te leggen.

Mocht je meerdere updates willen serializeren heb je dus een transaction nodig :z

Professionele website nodig?


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Om de topic-starter gerust te stellen; het maakt niet uit!

Als je vanuit php een record invoegt en je wilt het id hebben dat met die insert door middel van een auto_increment is gegenereerd, maak dan gebruik van mysql_insert_id. Aangezien deze functie kijkt welke id er op de huidige link is gegenereerd, maakt het niet uit of er tegelijkertijd door iemand anders een record toegevoegd wordt:

- PHP opent een connectie met Mysql DB
- PHP stuurt een insert-query naar de db, mysql retourneert het id dat hierdoor werd gegenereerd
- PHP onthoudt welke id dat is, hoe veel inserts er daarna ook (bij andere! connecties) volgen

Transactions heb je hiervoor niet nodig.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Topicstarter
Ik heb even wat gezocht en kwam er achter dat MySQL het z.g.n. 'locking' gebruikt om tabellen tijdelijk af te sluiten voor gebruik.

Ik weet niet of iemand hier een beetje verstand heeft van dit principe, want ik vraag me af of ik met deze functie dus kan voorkomen dat andere gebruikers in de tabellen schrijven, wanneer er nog een gebruiker bezig is met wegschrijven. Ik gok dus dat het 'locken' van tabellen op de onderstaande manier gaat, klopt dit?

Voorbeeld:

Gebruiker 1:
  1. 'lock' tabel 1 voor overige gebruikers
Gebruiker 2:
  1. gebruiker 2 komt erbij en wil gegevens in tabel 1 wegschrijven, maar krijgt hiervoor de kans niet omdat tabel 1 'gelocked' is
  2. gebruiker 2 komt in de wachtrij te staan
Gebruiker 1:
  1. schrijf de gegevens in de 'gelockte' tabel 1l
  2. 'unlock' tabel 1
Gebruiker 2:
  1. schrijf de gegevens weg in tabel 1 (die nu dus weer vrijgegeven is)

  • eborn
  • Registratie: April 2000
  • Laatst online: 20-08 15:45
Verwijderd schreef op 29 August 2003 @ 01:58:
Ik weet niet of iemand hier een beetje verstand heeft van dit principe, want ik vraag me af of ik met deze functie dus kan voorkomen dat andere gebruikers in de tabellen schrijven, wanneer er nog een gebruiker bezig is met wegschrijven. Ik gok dus dat het 'locken' van tabellen op de onderstaande manier gaat, klopt dit?
Locking gebeurd bij MySQL standaard inderdaad op tabel-niveau (als ik me niet vergis). Bepaalde extensies kunnen ook per row locken.

Maar daar merk je verder niets van hoor. Ik bedoel, ik weet nou niet precies op welke manier ik je post moet interpreteren. Het lijkt er namelijk op alsof je nog steeds bang bent dat er twee dingen 'tegelijk' weggeschreven worden. En ik snap ook niet precies wat daar het probleem van is. Het is toch een database? Volgens mij doe je heel moeilijk over iets heel simpels ;)

[ Voor 5% gewijzigd door eborn op 29-08-2003 02:05 ]


Verwijderd

Topicstarter
Nou het gaat mij erom dat als klaas met het id "3" weggeschreven wordt, dat het bijbehorende eigenschappen-id ook "3" is en dus niet bv. "4" als "3" voor die tijd door een andere gebruiker wordt "ingepikt"... :)
 
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
TABEL: blaat

id      name
1       jan
2       piet
3       klaas

TABEL: properties

id      lenght
1       groot
2       klein
3       gemiddeld

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Verwijderd schreef op 29 augustus 2003 @ 02:17:
Nou het gaat mij erom dat als klaas met het id "3" weggeschreven wordt, dat het bijbehorende eigenschappen-id ook "3" is en dus niet bv. "4" als "3" voor die tijd door een andere gebruiker wordt "ingepikt"... :)
Wat je hier beschrijft is het race-effect en dat heeft weinig tot niets met locking te maken. Locking zorgt er bijvoorbeeld voor dat er geen corrupte data kan ontstaan als twee users (of beter: threads) tegelijk willen inserten. Dat een tabel gelockt wordt tijdens een insert, neemt niet weg dat er dingen mis kunnen gaan als er vanuit twee threads heel snel achter elkaar een record wordt ge-insert. Wat je wilt is een sluitende methode om te achterhalen welk id werd gegenereerd met een bepaalde insert-query; mysql_insert_id is je vriend.

Foute methode:
PHP:
1
2
3
4
5
$sqlResult = mysql_query("INSERT INTO tabel VALUES ('bla', 'bla')");
$sqlResult = mysql_query("SELECT MAX(id) FROM tabel");
$myrow = mysql_fetch_assoc($sqlResult);
$id = $myrow['id'];
$sqlResult = mysql_query("INSERT INTO tabel2 VALUES ($id, 'bla', 'bla')");
Dit *kan* fout gaan: als er tussen de eerste twee statements een andere thread een record toevoegt aan de tabel. Beide threads krijgen dan het id van de tweede insert.

Goede methode:
PHP:
1
2
3
$sqlResult = mysql_query("INSERT INTO tabel VALUES ('bla', 'bla')");
$id = mysql_insert_id();
$sqlResult = mysql_query("INSERT INTO tabel2 VALUES ($id, 'bla', 'bla')");
Nu wordt altijd het id van de huidige thread opgehaald. Elke PHP-thread heeft een eigen link met de database, en de insert_id word per link bijgehouden. Kan dus niet mis gaan.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

Topicstarter
Ok. bedankt!
Pagina: 1