Code pour la méthode deposer de l'EJB :

  /**
   * Déposer un montant sur un compte. Version qui tient compte de la
   * concurrence.
   */
  public void deposer(CompteBancaire compte, int montant) {
    int solde = compte.getSolde();
    boolean concurrence = false;
    compte = em.find(CompteBancaire.class, compte.getId(),
            LockModeType.PESSIMISTIC_WRITE);
    if (solde != compte.getSolde()) {
      // le solde a été modifié ; il faut avertir l'utilisateur
      concurrence = true;
    }
    compte.deposer(montant);
    update(compte);
    if (concurrence) {
      // le solde a été modifié ; il faut avertir l'utilisateur
      throw new ConcurrentAccessException("Dépôt effectué mais le solde a été modifié concurremment");
    }
  }

Code similaire pour la méthode retirer.

Code pour le backing bean :

  public String enregistrerMouvement() {
    try {
      if (typeMouvement.equals("ajout")) {
        try {
        gestionnaireCompte.deposer(compte, montant);
        } catch(ConcurrentAccessException ex) {
          Util.addFlashErrorMessage(ex.getMessage());
        }
      ...

La classe d'exception :

import javax.ejb.ApplicationException;

/**
 * Exception lancée en cas d'accès concurrent sans gravité.
 */
@ApplicationException(rollback = false)
public class ConcurrentAccessException extends RuntimeException {

  public ConcurrentAccessException(String message) {
    super(message);
  }
}