sql - Quel est le meilleur niveau d'isolement de transaction par défaut pour un ERP, le cas échéant?

Translate

Bref historique: Nous commençons tout juste à migrer / réimplémenter un système ERP vers Java avec Hibernate, en ciblant un nombre d'utilisateurs simultanés de 50 à 100 utilisateurs utilisant le système. Nous utilisons MS SQL Server comme serveur de base de données, ce qui est assez bon pour ces charges.

Maintenant, l'ancien système n'utilise aucune transaction du tout et compte pour les pièces critiques (par exemple les changements de stock) sur la définition de verrous manuels (en utilisant des indicateurs) et leur libération. C'est quelque chose comme la gestion manuelle des transactions. Mais il y a parfois des problèmes d'incohérence des données. Dans le nouveau système, nous aimerions utiliser des transactions pour éliminer ces problèmes.

Maintenant la question: quel serait un bon / raisonnabledéfautniveau d'isolement des transactions à utiliser pour un système ERP, étant donné une utilisation d'environ 85% OLTP et 15% OLAP? Ou devrais-je toujours décider, par tâche, quel niveau de transaction utiliser?

Et pour rappel les quatre niveaux d'isolement des transactions: LIRE SANS ENGAGEMENT, LIRE COMMITTED, REPEATABLE READ, SERIALIZABLE

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

99 fois sur 100, la lecture validée est la bonne réponse. Cela garantit que vous ne voyez que les modifications qui ont été validées par l'autre session (et, par conséquent, des résultats cohérents, en supposant que vous avez correctement conçu vos transactions). Mais cela n'impose pas la surcharge de verrouillage (en particulier dans les bases de données non Oracle) que la lecture répétable ou sérialisable impose.

Très occasionnellement, vous souhaiterez peut-être exécuter un rapport dans lequel vous êtes prêt à sacrifier la précision au profit de la vitesse et à définir un niveau d'isolement de lecture non validé. C'est rarement une bonne idée, mais c'est parfois une solution de contournement raisonnablement acceptable pour verrouiller les problèmes de conflit.

La lecture sérialisable et répétable est parfois utilisée lorsque vous avez un processus qui a besoin de voir un ensemble cohérent de données sur l'ensemble de l'exécution, indépendamment de ce que font les autres transactions à ce moment-là. Il peut être approprié de définir un processus de réconciliation de fin de mois sur sérialisable, par exemple, s'il y a beaucoup de code procédural, une possibilité que les utilisateurs apportent des modifications pendant que le processus est en cours d'exécution et une exigence selon laquelle le processus doit assurez-vous qu'il voit toujours les données telles qu'elles existaient au moment où la réconciliation a commencé.

La source
Translate

N'oubliez pas SNAPSHOT, qui se trouve juste en dessous de SERIALIZABLE.

Cela dépend de l'importance de l'exactitude des données dans les rapports. C'est vraiment une chose tâche par tâche.

La source
Translate

Cela dépend vraiment beaucoup de la façon dont vous concevez votre application, la réponse simple est simplement de lancer READ_COMMITTED.

Vous pouvez faire valoir que si vous concevez votre système en tenant compte de cela, vous pouvez utiliser READ_UNCOMMITTED par défaut et n'augmenter le niveau d'isolement que lorsque vous en avez besoin. La grande majorité de vos transactions réussira de toute façon, donc la lecture de données non validées ne sera pas un gros problème.

La manière dont les niveaux d'isolation affectent vos requêtes dépend de votre base de données cible. Par exemple, les bases de données comme Sybase et MSSQL doivent verrouiller plus de ressources lorsque vous exécutez READ_COMMITTED, que les bases de données comme Oracle.

La source
Translate

Pour SQL Server (et probablement la plupart des grands SGBDR), je m'en tiendrai à la valeur par défaut. Pour SQL Server, il s'agit de READ COMMITTED. Rien de plus et vous commencez à surtaxer la base de données, rien de moins et vous avez des problèmes de cohérence.

La source
Translate

Read Uncommitted est définitivement l'opprimé dans la plupart des forums. Cependant, il y a des raisons de l'utiliser qui vont au-delà d'une question de «vitesse contre précision» qui est souvent soulignée.

Disons que vous avez:

  • Transaction T1: écrit B, lit A, (encore du travail), validez.
  • Transaction T2: écrit A, lit B, (un peu plus de travail), validez.

Lorsque la lecture est validée, les transactions ci-dessus ne seront pas libérées avant la validation. Ensuite, vous pouvez vous retrouver dans une situation où T1 attend que T2 libère A et T2 attend que T1 libère B. Ici, les deux transactions entrent en collision dans un verrou.

Vous pouvez réécrire ces procédures pour éviter ce scénario (exemple: acquérir des ressources toujours par ordre alphabétique!). Pourtant, avec trop d'utilisateurs simultanés et des dizaines de milliers de lignes de code, ce problème peut devenir à la fois très probable et très difficile à diagnostiquer et à résoudre.

L'alternative consiste à utiliser Read Uncommitted. Ensuite, vous concevez vos transactions en supposant qu'il peut y avoir des lectures incorrectes. Personnellement, je trouve ce problème beaucoup plus localisé et traitable que les épaves de train imbriquées.

Les problèmes liés aux lectures incorrectes peuvent être anticipés par

  • (1) Rollbacks: ne le faites pas. Cela devrait être la dernière ligne de défense en cas de panne matérielle, de panne réseau ou de panne du programme uniquement.

  • (2) Utilisez les verrous d'application pour créer un mécanisme de verrouillage qui fonctionne à un niveau d'abstraction supérieur, où chaque verrou est plus proche d'une ressource ou d'une action du monde réel.

La source
Leave a Reply
You must be logged in to post a answer.
A propos de l'auteur