2010-11-19 6 views
3

J'essaye d'implémenter un verrou hors ligne pessimiste en utilisant Spring et JPA/Hibernate. J'ai une table de verrouillage dans ma base de données qui stocke tous les verrous (ID de l'enregistrement qui est verrouillé, timestamp et utilisateur). L'interface de service LockManager ressemble à ceci:Pessimistic Offline Lock (Java, Spring)

public interface LockManager { 

    @Transactional(isolation=Isolation.SERIALIZABLE)  
    public Boolean TestAndGetLock(Application app, User user); 

    public void realeaseLock(Application app, User user); 
} 

La méthode TestAndGetLock premiers tests s'il y a un verrou sur le dossier. S'il y en a, il retourne vrai et se termine. S'il n'y en a pas, il renvoie false et crée le verrou (écrit un nouveau verrou dans la table de verrouillage). Ce n'est qu'alors que la webapp démarre réellement la transaction commerciale (dans ce cas, elle affiche un formulaire d'édition pour l'application transmise en tant que paramètre).

Pouvez-vous me dire si ce design est correct?

+0

Les niveaux d'isolation personnalisés ne fonctionnent généralement pas avec les gestionnaires de transactions jpa/hibernate. – Bozho

+0

pourquoi pas eux? ne sont-ils pas supportés? –

Répondre

1

Je corrigerait la conception à:

public boolean lock(Application app, User user); 

public void unlock(Application app, User user); 

alors voici les noms seront plus clairs. Le comportement est le suivant: le code client appelle lock() et s'il est verrouillé, il renvoie true, false sinon. Il corrige un peu de malentendu dans votre API: si elle a réussi à verrouiller smth, alors pourquoi il retourne faux? En outre, il serait plus simple d'écrire le code client:

if (lockManager.lock()) { 
... 
} else { 
    throw new LockNotObtainedException() 
} 

La deuxième méthode est ok à mon avis.