> INSERT INTO bruger () VALUES ()
> SELECT LAST_INSERT_ID() AS Ref_Bruger_ID
> UPDATE bruger SET felt1=vaerdi1...WHERE ID = Ref_Bruger_ID
Jeg må tilstå, at jeg ikke lige bruger mySQL, men er storbruger af
Oracle og førhen MSSQL. Men her er mine 5 cents:
1. Jeg kan se, at der er kommet transactions i mysql, og du skal i hvert
fald sørge for at lave tabeller af typen InnoDB tabeller, hvor der er
fuld ACID implementering. Ellers vil du støde ind i nedenstående.
2. Hvis du har mange skrivninger og læsninger, vil mySQL give dig
problemer, da der, så vidt jeg ved, ikke er row locking, men kun table
locking. Dvs. at alle læsninger skal vente på en hver update. Også selv
om det er en anden row i den givne tabel.
Lad mig illustrere pkt. 1:
KL. User 1 User 2
00.01 Insert (ID 1) .. Last insert = 1
00.05 .. Insert (ID 2) Last insert = 2
00.06 Select (ID 2) .. Finder 2 men skulle finde 1
00.08 .. Select (id 2) Finder 2 korrekt
00.10 Update (ID 2) .. Updater 2 men skulle Update 1.
00.12 .. Update (id 2) Updater korrekt 2, men kvæster
Data fra 1 i processen.
Det ville sikkert ikke dreje sig om minutter som her, men om
millisekunder. However så illustrerer ovenstående godt nok.
Problemet er at du ikke har en atomar hændelse i at oprette og skrive
data til et id. Du skal enten selv kode det, eller finde en database,
der kan styre dette for dig (det kan mysql kan jeg se). Hvis du eks.
koder i java kan du lave noget syncronized kode, der sørger for netop at
kun en process (tråd) kan køre en oprettelse ad gangen.
- Nico
|