dimanche 28 septembre 2008

Transactions

Pfiou, c'était du sport!

J'ai enfin implémenté le système de transactions dans le cœur du programme.

Voilà le problème: de nombreuses actions des utilisateurs doivent être persistées de manière transactionnelle dans la base. Par exemple, effectuer un achat revient à ajouter le nouvel élément dans la base, et à mettre à jour le solde. Si l'application s'arrête (crash, coupure de courant...) entre les deux, il faut que la base revienne à l'état d'avant la première opération.

Ces transactions sont parfois complexes: par exemple, dans le cas d'un contrat entre deux joueurs, il va falloir mettre à jour les deux soldes, plus les deux inventaires pour les contrats, plus peut-être une autre table pour les modalités du contrat.

J'ai donc implémenté ma solution en passant une liste d'actions à effectuer lors de chaque opération se passant au niveau de la représentation du joueur sur le serveur. L'objet ajoute l'opération à la liste. Lorsque l'opération est finie, et que tous les joueurs ont rempli la liste, je l'exécute.

Voilà un exemple de log lors de l'achat d'un bâtiment: on voit la transaction démarrer, le solde se mettre à jour, la liste des bâtiments du joueur se mettre à jour également, et la transaction est commitée!


Starting transaction
Executing insert into Balance(operation_id, account_id, change, balance) values (default, $1, $2, $3)
Affected 1 rows in 0 ms
Executing insert into CorpBuilding(corpbuilding_id, account_id, building_id, level) values ($1, $2, $3, $4)
Affected 1 rows in 0 ms
Transaction finished in 0 ms

Aucun commentaire: