Domanda

Sto scrivendo una strategia di tipo di gioco multi utente per il web. Ha un campo di gioco (X da quadrati Y), che ho intenzione di serializzare e conservare in un BLOB in un database MySQL (InnoDB), una riga per ogni partita in corso.

Ora cercare di capire un buon modo di mantenere il database aggiornato con le eventuali modifiche al campo di gioco, e allo stesso tempo trovare una soluzione conveniente per come gestire le cose che accadono al campo di gioco nel lasso di tempo tra il caricamento del pagina e in realtà fare una mossa.
Io non uso di AJAX.

Non ci sarà al massimo di 20 giocatori in ogni partita, ogni giocatore fare tra 1 e 10 si muove in 24 ore, quindi si tratta di un gioco "lento".

Il mio piano (finora) è quello di memorizzare anche una sorta di checksum per il campo di gioco accanto al blob e confrontare lo stato di database con lo stato caricato prima di tentare di apportare modifiche al campo di gioco.

Quello che mi preoccupa è su come prevenire le condizioni di gara.
È sufficiente:

  1. iniziare la transazione.
  2. carico campo di gioco da tavolo
  3. se checksum diverso - ripristino e aggiornare gli utenti di visualizzare
  4. se checksum invariato - tabella di aggiornamento e si impegnano modifiche

È l'abbastanza BEGIN TRANSACTION per bloccare la corsa, o ho bisogno di fare qualcosa di più nella fase 2 di mostrare la mia intenzione di aggiornare la tabella?

riconoscente per tutti i consigli.

È stato utile?

Soluzione

Se si utilizza SELECT ... FOR UPDATE quando si carica il campo di gioco dal database, bloccherà altri seleziona fino a commit o rollback della transazione.

Altri suggerimenti

No. Sarà necessario emettere un comando LOCK TABLES per le tabelle necessarie per la protezione contro gli aggiornamenti in conflitto. Questo sarebbe simile ...

LOCK TABLE my_table WRITE;

Più informazioni possono essere trovate qui ... http: //dev.mysql.com/doc/refman/5.1/en/lock-tables.html

Non si dimentichi di sbloccarle dopo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top