Deadlocks de base de données
L'un des classiques des raisons que nous avons une base de données de l'impasse, c'est quand deux opérations sont l'insertion et la mise à jour de tables dans un ordre différent.
Par exemple, la transaction A inserts de Tableau Un Tableau B.
Et de transaction B insère dans le Tableau B, suivi par A.
Un tel scénario est toujours le risque d'une base de données de blocage (en supposant que vous n'êtes pas à l'aide d'isolation serializable).
Mes questions sont:
- Ce genre de motifs que vous suivez dans votre conception pour s'assurer que toutes les transactions sont de l'insertion et de mise à jour dans le même ordre.
Un livre que je lisais - avait une suggestion que vous pouvez trier les déclarations faites par le nom de la table. Avez-vous fait quelque chose comme ceci ou différents, qui permettrait d'assurer que toutes les insertions et mises à jour sont dans le même ordre? - Ce sujet de la suppression d'enregistrements? Supprimer doit commencer à partir de tables enfants et les mises à jour et des inserts besoin pour commencer à partir de tables parent. Comment vous assurer que ce ne serait pas dans une impasse?
source d'informationauteur RN.
Vous devez vous connecter pour publier un commentaire.
l'insertion\mise à jour dans le même ordre.
supprimé en dehors d'une transaction et
puis de tenter la suppression, dans le
la plus petite possible de transaction, par exemple
à la recherche par la clé primaire ou similaire
identifiés lors de l'étape de recherche.
réglage de la vitesse des transactions
et de promouvoir la recherche d'index sur
tablescans.
par exemple, une table avec incrémentation
compteurs pour les autres tables primaire
les touches. Toute autre "standard" type
la configuration est risqué.
la recherche du comportement de la cible
SGBDR en détail (optimiste /
pessimistes, les niveaux d'isolation, etc.)
Assurez-vous de ne pas autoriser les verrous de ligne à
escalade de verrous de table comme certains
RDMSes volonté.
Blocages sont pas trop grave. Juste être prêt à réessayer de vos transactions en cas d'échec.
Et de le garder court. Court transactions constituée de requêtes qui touche très peu de dossiers (via la magie de l'indexation) sont idéales pour minimiser les blocages de moins en moins de lignes sont verrouillés, et pour une courte période de temps.
Vous devez savoir que les moteurs de base de données ne pas verrouiller les tables; ils verrouillent les lignes; si les blocages sont un peu moins susceptibles.
Vous pouvez également éviter le blocage en utilisant MVCC et de la LECTURE COHÉRENTE niveau d'isolation de transaction: au lieu de bloquer, certains threads viens de voir des données périmées.
Soigneusement la conception de votre base de données de processus pour éliminer autant que possible les transactions qui impliquent plusieurs tables. Quand j'ai eu de la base de données de contrôle de la conception il n'y a jamais eu un cas de blocage pour laquelle je ne pouvais pas la conception de l'état qui l'a causé. Cela ne veut pas dire qu'ils n'existent pas et peut-être abondent dans des situations hors de mon expérience limitée; mais je n'ai pas eu le manque de possibilités d'améliorer la conception à l'origine de ces types de problèmes. Une évidence, la stratégie est de commencer avec un chronologique en écriture seule table pour l'insertion de nouveaux complète transactions atomiques sans interdépendances, et d'appliquer leurs effets de manière ordonnée dans un processus asynchrone.
Toujours utiliser la base de données par défaut des niveaux d'isolement et les paramètres de verrouillage de sauf vous êtes absolument sûr de ce que les risques qu'ils encourent, et nous l'avons prouvé par des essais. Refonte de votre processus si possible en premier. Ensuite, imposer le moins que l'augmentation de la protection nécessaire pour éliminer le risque (et le test pour le prouver.) N'augmentent pas de restriction "au cas où" - cela conduit souvent à des conséquences inattendues, parfois, du type destiné à éviter.
À répéter le point d'un autre côté, la plupart de ce que vous lirez sur ce sujet et sur d'autres sites plaidant en faveur de la modification des paramètres de base de données pour traiter les risques de transaction et les problèmes de verrouillage est trompeuse et/ou de faux, comme l'ont démontré comment ils entrent en conflit les uns avec les autres de façon régulière. Malheureusement, surtout pour SQL Server, je n'ai trouvé aucune source de documentation qui n'est pas désespérément confus et insuffisante.
J'ai constaté que l'un des meilleurs investissements que j'ai jamais fait de éviter les blocages était d'utiliser un Object Relational Mapper qui pourrait l'ordre de la base de données des mises à jour. L'ordre n'est pas important, tant que chaque transaction écrit dans le même ordre (et supprime exactement dans l'ordre inverse).
La raison que ce qui évite la plupart des blocages de la boîte, c'est que vos opérations sont toujours table de Une première, puis de la table B, puis le tableau C (qui peut-être dépend de la table B).
Vous pouvez obtenir un résultat similaire aussi longtemps que vous faire preuve de prudence dans vos procédures stockées ou de la couche de données de code d'accès. Le seul problème est qu'il ne nécessite grande soin de le faire à la main, tandis qu'un ORM avec une Unité de Travail concept peut automatiser la plupart des cas.
Mise à JOUR: UNE suppression devrait courir en avant pour vérifier que tout est la version que vous attendez (vous avez encore besoin d'enregistrer les numéros de version ou d'horodateurs) et supprimez l'arrière une fois que tout le vérifie. Comme tout ceci doit se produire dans une transaction, la possibilité de quelque chose qui change de la vertu, vous ne devrait pas exister. La seule raison de l'ORM faire à l'envers, c'est obéir aux exigences clés, mais si vous faites votre chèque à l'avant, vous aurez toutes les serrures, vous devez déjà dans la main.
J'analyse toutes les actions de base de données afin de déterminer, pour chacun, s'il doit être un multiple de déclaration de transaction, puis pour chacun de ces cas, ce que le minimum de niveau d'isolement est nécessaire pour éviter les blocages... Comme vous l'avez dit serializable va certainement le faire...
En général, que très peu d'actions de base de données de plusieurs déclaration de transaction en premier lieu, et de ceux-là, seuls quelques-uns exigent une isolation serializable pour éliminer les blocages.
Pour ceux qui n', définir le niveau d'isolation de la transaction avant de vous lancer, et de le réinitialiser, quel que soit votre défaut est après qu'il s'engage.
Votre exemple ne serait un problème si la base de données verrouillée de l'ENSEMBLE de la table. Si votre base de données est en train de faire...exécuter 🙂