JPA et MySQL niveau d'isolation de transaction
J'ai une requête native qui ne un lot insérer dans une base de données MySQL:
String sql = "insert into t1 (a, b) select x, y from t2 where x = 'foo'";
EntityTransaction tx = entityManager.getTransaction();
try {
tx.begin();
int rowCount = entityManager.createNativeQuery(sql).executeUpdate();
tx.commit();
return rowCount;
}
catch(Exception ex) {
tx.rollback();
log.error(...);
}
Cette requête provoque un blocage: pendant qu'il lit à partir de t2
avec insert .. select
, un autre processus tente d'insérer une ligne dans t2
.
Je ne se soucient pas de la cohérence de lit à partir de t2
lors d'une insert .. select
et que vous voulez définir le niveau d'isolation de transaction à READ_UNCOMMITTED.
Comment puis-je aller sur la configuration dans JPA?
Mise à jour
J'ai donc fini par la création d'un régulier de connexion SQL, pour ce cas, comme il me semble l'option la plus simple. Merci à tous!
Je ne comprends pas comment il conduit à une impasse? Si tx1 exécuter l' : insert into t1 (a, b) sélectionnez x, y de t2 où x = 'foo' Et tout ce qui se passe à la deuxième tx faire insérer dans "t2" de la table, que tx1 avoir à attendre jusqu'à tx2 prendra fin, après tx2 a terminé la tx1 continuer. Dedalock dire que le tx2 tout en faisant des inserts en t2 également de faire la lecture à partir de t1? Est-ce votre cas? je veux dire quelque chose comme cela conduit à une impasse: tx1: insert into t1 (a, b) sélectionnez x, y de t2 où x = 'foo' tx2: insert into t2 (a, b) sélectionnez x, y de t1 où x = 'foo'
OriginalL'auteur armandino | 2010-05-27
Vous devez vous connecter pour publier un commentaire.
Vous devez le régler au niveau de la connexion, obtenir de la session de l'entitymanager et ce faire:
c'est pourquoi j'ai dit "obtenir de la session de l'em" 😉 j'ai édité le code
et si ce n'est pas hibernate?
Eh bien, il a dit qu'il est l'utilisation d'Hibernate. Je suppose qu'il existe des façons de le faire pour d'autres pour d'autres implémentations JPA.
Salut Guillaume, je l'ai fait essayer à votre approche de la fin, mais ça ne marchait pas, malheureusement, de voir cette session.connexion() la méthode est obsolète, j'ai décidé de ne pas passer du temps à les étudier.
OriginalL'auteur Guillaume
En JPA vous n'avez pas. JDO est la seule norme qui prend en charge le paramètre txn isolement. Évidemment aller de particulier pour les implémentations de méthodes peuvent permettre, mais alors vous devenez un non-portable
OriginalL'auteur DataNucleus
Puisque vous êtes à l'aide de GSM, vous pouvez effectuer les opérations suivantes à l'aide d'une source de données pour obtenir la connexion.
et de définir la norme iso. niveau.
OriginalL'auteur OpenSource