Avatar billede zorci Nybegynder
19. december 2007 - 09:08 Der er 7 kommentarer

Synkronisering eller lock af kodeblok i Stored Procedure

I Java kan man låse (synchronize) funktioner og blokke af kode. Er dette også muligt i MySQL?

Eksempel:

kode
kode
(lås)
kode
kode
(lås op)
kode
kode

Det er meningen at den kode der er inde i min lås, kun må eksekveres af én tråd af gangen.

Jeg vil helst løse dette uden at skulle låse tabeller. Kan det lade sig gøre?
Avatar billede zorci Nybegynder
19. december 2007 - 10:13 #1
Det er i en Stored Procedure jeg har det her problem. Jeg får mange requests ind og laver et tjek (en if/else) i min stored procedure som afgør om en record skal oprettes eller om den findes i forvejen.

Hvis en record findes ( IF ), skal et felt i den record tælles op med én. Hvis den ikke findes ( ELSE ) skal den oprettes.

Problemet er, at flere tråde når at spørge min procedure om der findes en record. flere af dem får svaret nej, inden den første der spurgte kommer ned og opretter en record i min ELSE. Resultatet er, at der oprettes 2-3 records hvilket giver mig problemer.

Det har fungeret fint indtil nu, jeg har først opdaget problematikken efter loaded på webserveren er steget markant.

Jeg kan naturligvis kode mig ud af det i min applikation, men jeg ville gerne have låsen nede i min Stored Procedure.
Avatar billede arne_v Ekspert
19. december 2007 - 15:23 #2
med MyISAM tabeller kan du bruge bulldozer metode og laase hele tabellen (se LOCK statement)

med InnoDB tabeller kan du lave en ordentlig loesning og bruge transactions med et passende hoejt transaction isolation level
Avatar billede zorci Nybegynder
19. december 2007 - 16:39 #3
Jeg benytter innoDB tabeller.

Men kan du ikke uddybe det lidt for mig? Jeg har nemlig selv tænkt tanken med transactions, men alligevel kan jeg ikke rigtig se hvordan det løser problemet. Selv om tråden kører i en transaction, kan andre tråde jo sagtens oprette en ny transaction og tilgå min stored procedure. Er det ikke rigtigt?
Avatar billede arne_v Ekspert
19. december 2007 - 16:47 #4
nej

lad os antage at du gaar paa transaction level serializable

det betyder at alle SELECT i din transaction vil returnere det samme antal raekker og
de samme data i raekkerne hvis de blev udfoert paa et senere tidspunkt i transaktionen

det goer at databasen er noedt til at forhindre andre processer i at lave insert indtil
transaktionen er faerdig
Avatar billede arne_v Ekspert
19. december 2007 - 16:49 #5
til gegaeld skal din kode saa laves saa den kan retry i tilfaelde af timeout
eller deadlock detection
Avatar billede zorci Nybegynder
19. december 2007 - 17:07 #6
Jeg har prøvet
LOCK TABLES blah READ;

....

UNLOCK TABLES;

Men jeg får en fejl når jeg compiler min procedure. Man kan vist ikke lave låse i en Stored Procedure. :(

Jeg er noget usikker på det transactions halløj. Men må læse op på det.
Avatar billede arne_v Ekspert
20. december 2007 - 02:37 #7
transactions er vejen frem
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