4 votes

JDBC & Question sur la prévention des blocages (Basic)

J'utilise JDBC (via le modèle JDBCTemplate de Spring) pour accéder à un petit nombre de tables dans une base de données. Bien que rien ne se soit encore produit, je suis préoccupé par la possibilité d'un blocage.

J'avais l'impression qu'il était possible de spécifier un ordre de verrouillage pour les requêtes qui accèdent à plusieurs tables afin d'éviter les blocages, mais je ne sais pas si c'est le genre de chose qui est configuré au niveau de la base de données lors de la création de mes tables, ou si je dois faire quelque chose d'explicite avec mes requêtes JDBC.

En d'autres termes, existe-t-il un paramètre global ou autre pour spécifier l'ordre de verrouillage, ou bien cela doit-il être fait à chaque requête/mise à jour ?

Gracias.

6voto

BalusC Points 498232

Ceci doit être géré au niveau de la transaction. En général, on ne risque un blocage que lorsqu'il y a un problème de type "chicken-egg". C'est-à-dire qu'il y a deux transactions simultanées de verrouillage de rangée avec chacune des requêtes multiples dont les résultats dépendent de l'ordre de priorité de la transaction. autre transaction. Si le autre n'est pas terminée alors que la requête a été exécutée, alors la transaction autre la transaction ne sera pas en mesure de terminer sa propre requête.

Je ne sais pas comment JDBCTemplate gère les transactions, mais une connexion JDBC n'est pas transactionnelle par défaut. Une fois que vous avez défini l'option Connection#setAutoCommit() a false (ou le configurer pour qu'il le soit par défaut), alors la transaction commencera et se terminera quand vous appellerez Connection#commit() .

Pour éviter les blocages, la règle n°1 est d'éviter de mélanger SELECT con INSERT/UPDATE/DELETE en une seule transaction. Lorsque le mélange est - à première vue - obligatoire, vous devez au moins essayer de le réécrire dans une déclaration unique/imbriquée. C'est souvent possible. De cette façon, vous n'avez pas besoin d'exécuter ces requêtes dans une transaction.

En outre, certaines bases de données comme PostgreSQL et Oracle peuvent détecter automatiquement les blocages et annuler l'une des transactions, généralement celle qui a été lancée plus tard. Dans l'extrémité JDBC, vous recevrez un message spécifique de SQLException pour ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X