-
Gestion Accès concurent
Bonjour,
J'ai un problème dans mon appli, j'ai de gros traitement qui peuvent prendre des minutes par exemple l'insertion de plus de 30000 lignes (j'utilise le batch insert) durant ce temps là il est impossible d'accèder en lecture à la table même à partir de SQL SERVER si je fais par exemple un select *. donc voici les deux question que je me pose:
1-comment est ce qu'il est possible de gérer les accès concurrent de telle sorte que si une personne est entrain d'insérer une autre peut consulter (une fois je cherchai un autre sujet concernant hibernate et je suis tombé sur une doc qui traité de version et il y avait un champ qui devait être explicitement nommé version,est ce la solution?)
2-Si un user est entrain d'insérer ou faire des MAJ sur une table est ce qu'il y a moyen d'obtenir avec hibernate qu'il y a une MAJ ou des insertion en cours dans cette table et ainsi bloquer le deuxième utilisateur d'insérer ou de faire des MAJ sur la même table .
EDIT: je peux accèder en lecture si je fais select * from table (nolock)
Cordialement.
-
Je te suggère de jeter un coup d’œil aux niveaux d'isolation des transactions (c'est expliqué dans la FAQ JDBC). Avec Hibernate, ça se configure avec le paramètre hibernate.connection.isolation. Par exemple pour lire des données en cours de modifs, tu peux tenter de passer en isolation READ_UNCOMMITED pour faire des Dirty Read (c-a-d lire des données en cours de modification).
Par contre, tous les SGBD ne traitent pas les niveaux d'isolation de la même manière (par exemple certains empêchent la consultation de données en cours de modif alors que d'autres renvoient la dernière valeur commitée). C'est pourquoi il vaut mieux que tu regardes la doc SQL Server pour déterminer comment réagira précisément ton SGBD.
En ce qui concerne la "colonne version", c'est un pattern Hibernate (appelé verrou optimiste) pour gérer des accès concurrents en mise à jour. Si tu cherches à traiter de la concurrence sur mise à jour avec de la temporisation, peut-être que tu devrais utiliser des SELECT FOR UPDATE ?