Avatar billede tzr Nybegynder
29. oktober 2003 - 22:31 Der er 17 kommentarer og
1 løsning

SELECT Collision

Jeg har en database med en masse rows. Hertil skal et php script behandle 2 eller flere rows ad gangen. Det kan godt være chancen er lille, men hvordan forhindrer jeg at to instancer af scriptet behander den samme row på én gang ?

foretrækker evt kode i pseudo-kode eller php :) eller asp er også fint nok.

Håber nogle mySQL guruer kan hjælpe :)
Avatar billede arne_v Ekspert
29. oktober 2003 - 22:35 #1
Det er det som transaktioner er der for !

[husk at MySQL og transaktioner kræber InnoDB tabeller - MyISAM
duer ikke]
Avatar billede detox Nybegynder
29. oktober 2003 - 23:25 #2
Du kan osse bruge LOCK TABLES. Under normale omstændigheder skulle det dog ikke være nødvendigt, da fx en UPDATE bliver fuldført før andre får adgang til tabellen.
Avatar billede tzr Nybegynder
29. oktober 2003 - 23:28 #3
detox << ja, men problemet er at jeg skal SELECT behandle og så UPDATE. Og i al den tid skal de rows være utilgængelige ... jeg overvejede at lave en column der fortalte om feltet var i brug og noget, men det virker ineffektivt

Kan i ik komme med et SQL eksempel ? det ville være rart ... kan sagtens finde rundt i mySQL dokumentationen, men jeg ved ik helt hvad jeg præcist leder efter
Avatar billede detox Nybegynder
29. oktober 2003 - 23:32 #4
mysql> LOCK TABLES trans READ, customer WRITE;
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> UNLOCK TABLES;

Eksempel hentet her:
http://www.mysql.com/doc/en/LOCK_TABLES.html
Avatar billede arne_v Ekspert
29. oktober 2003 - 23:32 #5
Avatar billede arne_v Ekspert
29. oktober 2003 - 23:32 #6
Avatar billede tzr Nybegynder
31. oktober 2003 - 22:37 #7
detox << jamen vil det låse individuelle rows ?
Avatar billede arne_v Ekspert
31. oktober 2003 - 22:39 #8
LOCK TABLES gør det som navnet antyder: låser hele tabeller
Avatar billede tzr Nybegynder
31. oktober 2003 - 23:06 #9
det er jo ikke det jeg vil ... jeg vil på en eller anden måde forhindre andre instancer af scriptet til at læse rows som det nuværende svript har sagt at det "ejer" indtil de bliver frigivet.
Jeg kunne jo lave en column med noget serienummer og noget så scriptet selv checker, men er der ikke en måde man kan få mySQL til det ?
Avatar billede arne_v Ekspert
31. oktober 2003 - 23:11 #10
Det var også det jeg foreslog at løse med transaktioner.
Avatar billede tzr Nybegynder
31. oktober 2003 - 23:16 #11
jamen ih! jeg ved jo ik hvordan man gør :)
Avatar billede tzr Nybegynder
31. oktober 2003 - 23:41 #13
jep. Men det arbejde der skal laves på dataerne er ikke noget mySQL kan klare. Dataerne skal hentes ind til scriptet, og imens scriptet arbejder på det skal de rows ikke være tilgængelige for nogle andre scripts. Når scriptet så er færdigt skal ændringerne sendes til databasen, og de rows skal frigives igen.
Så vidt jeg kan se her går det meste af det ud på at æave ændringer der ikke bliver gemt med det samme
Avatar billede arne_v Ekspert
31. oktober 2003 - 23:44 #14
Ja og ?

Du laver START TRANSACTION, du laver de N SQÆ sætninger du vil, du laver
COMMIT - det virker vel lige så godt i PHP som i mysql command line
utility !?
Avatar billede tzr Nybegynder
01. november 2003 - 00:08 #15
er du ik lige en skat og skruer ned for temperamentet :)

godt være det bare er mig der er lidt træt, men jeg synes ik jeg kan finde det i manualen, så nu spørger jeg :)
når man laver en START TRANSACTION så bliver de rown jeg SELECTer låst for andre sessions ?
Avatar billede arne_v Ekspert
01. november 2003 - 00:16 #16
Transaction isolation level serializable betyder sådan groft sagt at
funktionaliteten er præcis som hvis trsnaktionerne havde været ægte
serialized (d.v.s. at næste transaktion først starter når forrige
er færdig).

I praksis laver databasen noget smart således at de kun venter
hvis det er nødvendigt.

Det vil formentlig ofte være baseret på row locking.

Du kan læse mere om transaction isolation levels her:

http://www.iona.com/support/docs/e2a/asp/5.0/j2ee/DevelopGuide/html/Jta-Bas5.html
Avatar billede arne_v Ekspert
16. november 2003 - 22:27 #17
OK ?
Avatar billede tzr Nybegynder
25. november 2003 - 21:08 #18
undskyld det sene svar, men projektet er lagt på køl :) men jeg takker mange gange for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester