Avatar billede stuffedk Nybegynder
02. december 2014 - 00:26 Der er 4 kommentarer

Hvordan undgår jeg "race conditions"?

Jeg er i gang med at lave et auktionshus website i Python. Folks konto bliver krediteret når deres bud matcher en andens bud. Pseudo koden ser cirka sådan ud:
1: Hvis bud matcher:
2: Slet bud
3: Beløn sælger
4: Giv køber vare


Men... Hvis nu en ondsindet bruger vil stjæle penge ud af siden kan han oprette en sådan auktion og med lidt kode refreshe siden 1000 gange i sekundet og hvis to eller flere af disse requests "når forbi" linje 1, så bliver han belønnet flere gange ved linje 3. Han kan derefter lave en ny auktion og så videre.

Hvordan undgår jeg bedst dette i python?
Avatar billede arne_v Ekspert
02. december 2014 - 00:40 #1
Et ord: transactions
Avatar billede arne_v Ekspert
02. december 2014 - 00:46 #2
Lidt mere info:
* husk at bruge InnoDB tabeller da MyISAM tabeller ikke understoetter transactions
* husk at saette transaction isolation level passende (jeg tror at du skal op i repeatable read)
Avatar billede stuffedk Nybegynder
02. december 2014 - 15:18 #3
Tak arne_v

Efter at have søgt på nettet i nogen tid har jeg "bikset" mig sammen til denne løsning:
conn = MySQLdb.connect (mysql_host, mysql_user, mysql_password, mysql_database)
cursor = conn.cursor(MySQLdb.cursors.DictCursor)
cursor.execute("select * from transactions for update",())
print cursor.fetchone()
time.sleep(600)
conn.commit()

Hvis man kører dette test eksempel 2 gange vil tråd 2 vente på at at tråd 1 bliver færdig (600 sekunder).
Er det sådan du mener det bør gøres mest effektivt arne? Det er rimeligt vigtigt for mig at det bliver gjort på den rigtige måde. (send også gerne svar)
Avatar billede arne_v Ekspert
02. december 2014 - 15:28 #4
Jeg foreslog:

BEGIN
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
flere SELECT og INSERT statements
COMMIT

Men du kan ogsaa bruge:

BEGIN
flere SELECT FOR UPDATE og INSERT statements
COMMIT
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