2010-10-08 2 views
1

J'utilise Websphere application server 7.0.0.0.9 avec: OpenJPA 1.2.3-SNAPSHOT '. J'ai la propriété Set de la source de données jdbc webSphereDefaultIsolationLevel = 2 (READ COMMITTED). J'ai cette question parce que ma compréhension est l'OptimasticLockException se produit s'il y a une course à commettre la même ligne par plusieurs threads. Mais je pense que cette situation ne devrait jamais se produire si le serveur d'application de niveau d'isolement est défini sur READ COMMITTED.peut OptimisticLockException se produire si le niveau d'isolement de l'application srv est défini sur READ COMMITTED?

C'est exception que je reçois ..

<openjpa-1.2.3-SNAPSHOT-r422266:907835 fatal store error> org.apache.openjpa.persistence.OptimisticLockException: An optimistic lock violation was detected when flushing object instance 

Répondre

1

J'ai cette question parce que je crois comprendre le OptimisticLockException se produit si la race de commettre la même ligne par fil multiple.

Oui, un OptimisticLockException sera levée si l'attribut Version d'une entité est plus élevée (à savoir a été modifié par une autre transaction) à consacrer du temps que lorsqu'il a été lu. Ceci est illustré par la figure ci-dessous (emprunté à JPA 2.0 Concurrency and locking):

alt text

Mais je pense que cette situation ne devrait jamais se produire si le serveur d'applications de niveau d'isolation est défini sur READ COMMITTED.

Pourquoi? Lorsque vous utilisez un niveau d'isolation READ COMMITTED, non-repeatable reads peut se produire, mais:

  1. Cela n'affectera pas la représentation de la mémoire des données (e1 dans l'exemple ci-dessus)
  2. La plupart du temps, vous ne données Relisez pas
    • Et même si vous le faites (et effectuez une lecture non répétable), une entité peut toujours être modifiée par un autre thread avant de valider les modifications.

En résumé, READ COMMITTED n'empêchera pas OptimisticLockException.

Questions connexes