web-dev-qa-db-fra.com

Quelle est la relation exacte entre une transaction de base de données et un verrouillage?

C'est une humble question posée dans l'esprit d'augmentation de mes connaissances; Veuillez être doux dans votre réponse.

En tant que développeur d'applications de longue date, je sais à un certain niveau une transaction (je les utilise tout le temps). Laissant de côté les niveaux d'isolation des transactions Pour le moment, à une transaction de niveau élevé, une transaction permet de terminer entièrement ou non du tout, et permet une certaine quantité d'isolation à partir d'une autre activité de modification de la base de données.

Je sais aussi ce que (dans diverses bases de données) une serrure est, ou du moins comment on se comporte (si je verrouille une table d'une manière explicite, aucun autre processus ou thread ne peut mettre à jour quelque chose à propos de cette table).

Ce que je suis très distinctement non Clear à propos de: Dans diverses bases de données, lorsque je verrouille explicitement une ligne ou une table, je l'utilise exactement les mêmes constructions utilisées par les installations de transaction de la base de données sous les couvertures à rendre la transaction fonctionner correctement?

C'est-à-dire que cela me survient que pour qu'une transaction soit atomique et isolée, cela doit faire du verrouillage. Est-ce que ce verrouillage caché de manière transacturée et déchargée de transaction, le même type de verrouillage que diverses bases de données me permettent d'accéder à des constructions telles que SELECT FOR UPDATE ou explicites LOCK commandes? Ou sont ces deux concepts complètement différents?

Encore une fois, je m'excuse pour la naïveté de cette question; Je suis heureux d'être dirigé vers des sources plus fondamentales.

16
Laird Nelson

lorsque je verrouille explicitement une ligne ou une table, je l'utilise exactement les mêmes constructions utilisées par les installations de transaction de la base de données sous les couvertures pour que la transaction fonctionne correctement?

Oui. Si cela ne serait pas vrai, alors votre propre "verrouillage" ne serait affiché que sur un autre "verrouillage" similaire et ne pas interagir avec le verrouillage du moteur. Donc, vous verrez une rangée dans une table de sorte qu'il ne puisse pas être verrouillé par une autre application de la même manière, mais votre serrure serait ignoré par le moteur lui-même. Ces sémantiques sont rarement souhaitées. La plupart du temps, une application verrouillant une ligne signifie "verrouiller-la contre tout moyen d'accès/modification". Notez la lettre que les mécanismes de verrouillage qui sont strictement d'application spécifiques font existe, car ils sont utiles. Par exemple, SQL Server a Serrures d'application .

il me semble que pour qu'une transaction soit atomique et isolée, elle doit faire du verrouillage.

Le verrouillage est un moyen de réaliser cela. L'alternative majeure est la version suivante. De nos jours, la plupart des bases de données prennent en charge les deux (ce qui signifie également que si vous "verrouillez" une ligne de l'application, mais une autre transaction utilise la version suivante pour lire la ligne, elle le lira car votre verrouillage ne bloque pas les lectures de Versed).

Vous êtes en quelque sorte entourant un concept connu dans le monde de la mise en œuvre de la base de données comme Protocole de verrouillage de deux phases ' . L'article Wikipedia lié est un bon démarreur. Si vous souhaitez lire une explication plus détaillée sur ce sujet, je recommande la tête de la bibliothèque et demandez un prêt sur Traitement des transactions: concepts et techniques . À peu près toutes les bases de données, il y a, à son cœur, une mise en œuvre de ce livre.

12
Remus Rusanu

Contez-vous avant de répondre à vos questions:

Remarque: Ceci est lié à Microsoft SQL Server - RDBMS ........

  • En termes très simples, une transaction est une séquence de travail qui doit être effectuée comme une seule unité logique dans son intégralité et doit maintenir des propriétés acides.
  • Toute SGDBM doit fournir des "installations de verrouillage" pouvant être utilisées pour compléter la transaction dans son intégralité, en préservant l'isolement de la transaction et sa durabilité. Cela garantit l'intégrité physique de la base de données.
  • Plus important encore, par défaut - Les transactions sont gérées au niveau de la connexion. Ainsi, lorsqu'une transaction est démarrée sur une connexion, toutes les instructions T-SQL (S/I/U/D) exécutées sur cette connexion font partie de la transaction jusqu'à la fin de la transaction. (- [~ # ~] Mars [~ # ~ ~] est géré différemment)

Retour à vos questions:

lorsque je verrouille explicitement une ligne ou une table, je l'utilise exactement les mêmes constructions utilisées par les installations de transaction de la base de données sous les couvertures pour que la transaction fonctionne correctement?

Oui. Cela signifie que vous devez faire attention à déterminer la séquence de données qui seront modifiées et qui laisseront la base de données à un état cohérent. En d'autres termes, votre opération DML devrait quitter la base de données dans un état cohérent qui se limite aux règles commerciales de votre organisation. Néanmoins, le SGBBS (ici SQL Server) peut appliquer l'intégrité physique de la transaction.

À partir de BOL: VERROUILLAGE ET VERSION DE LIGURE Empêchez les utilisateurs de lire des données non engagées et d'empêcher que plusieurs utilisateurs de tenter de modifier les mêmes données en même temps. Sans verrouillage ni verrouillage, les requêtes exécutées contre ces données pourraient produire des résultats inattendus en retournant des données qui n'ont pas encore été commises dans la base de données.

Est-ce que cette transaction a été enregistrée par transaction-cachée de verrouillage du même type de verrouillage que diverses bases de données permettent d'accéder à des constructions telles que Sélectionner des commandes de mise à jour ou de verrouillage explicite?

Tout dans SQL Server est contenue dans une transaction. C'est lorsque vous accédez à vos données, le RDBMS doit prendre des verrous en fonction du niveau d'isolation et des opérations que vous effectuez sur vos données. Vérifiez this Répondez pour plus de détails.

Quelques bonnes références:

3
Kin Shah

Je dirais que des transactions font partie de la "interface" de la base de données dans un sens, c'est que vous en tant que développeur décider quand commencer, finir, ce qu'il faut faire dans la portée des transactions, etc. Serrures, comme je les vois, appartenez aux détails de la mise en œuvre. et utilisé pour la synchronisation d'accès à différents objets. Dans la plupart des cas, le moteur lui-même décide de quoi et pendant combien de temps devrait être verrouillé. Il existe de nombreux serrures de niveau système qui ne peuvent pas être directement manipulés (par exemple, le moteur peut verrouiller certaines zones de mémoire). Même lorsqu'il s'agit de verrouiller DML, beaucoup d'entre eux se produisent derrière la scène (par exemple, pour assurer une intégrité référentielle oracle et, autant que je me souvienne, SQLServer peut mettre une serrure sur une ligne correspondante dans la table principale si un nouvel enregistrement est inséré dans Détails Tableau) À la suite de déclarations DML émises dans la transaction.

En ce qui concerne les transactions, vous pouvez vous attendre à des comportements plus ou moins cohérents de tout RDM qui prétend respecter SQL et de soutenir les transactions, mais lorsqu'il s'agit de verrouiller, presque chaque fournisseur utilise une stratégie et une terminologie différentes. La partie commune de tous les RMD autant que je puisse dire, c'est que la concurrence entre les transactions est définie par niveau d'isolement, tandis que la concurrence entre les verrous est contrôlée par des types de verrouillage (partagés, exclusifs, etc.).

Pour résumer, les verrous sont un mécanisme de faible niveau pour contrôler la cohérence des objets et la concurrence. Les verrous peuvent être émis lors de l'exécution des relevés SQL. Dépend de la mise en oeuvre du niveau d'isolement des transactions, le moteur peut mettre différents types de verrous sur des objets affectés (lignes, groupe de lignes, index, etc.). Il existe un nombre limité de commandement disponible pour émettre manuellement les serrures (SELECT FOR UPDATE, LOCK). Les verrous DML peuvent être escaladés (dépend des RDM, par exemple, dans SQLServer Row-> page-> Table de partition-> Table). Les verrous peuvent également être émis par le moteur de base de données lors de l'initiation de la connexion, des sauvegardes, de la restauration, de la procédure/de la gâchette/de la fonction/etc. Recompilation, démarrage, arrêt, etc.

Je ne sais pas si cela répond à votre question, mais j'espère que cela a du sens.

2
a1ex07

Je vais utiliser SQL Server Jargon, mais les concepts doivent être les mêmes pour les autres fournisseurs:

Chaque commande que vous exécutez est exécutée dans une transaction. Cette transaction peut être ouverte explicitement avec Begin Tran, ou implicitement, par le moteur de base de données. La raison qu'une transaction implicite est ouverte est que le moteur doit toujours maintenir la conformité acide et la capacité d'un retour.

Lorsque vous sélectionnez une sélection de mise à jour, cela signifie simplement que lorsque la transaction est en place, elle tiendra une certaine serrure.

1
Matan Yungman

Le verrouillage est nécessaire et ils font la base de données. Cela empêche les données d'être corrompues ou invalidées lorsque plusieurs utilisateurs essaient de lire tandis que d'autres écrivent dans la base de données. L'isolement transactionnel est généralement mis en œuvre en verrouillant tout ce qui est accessible dans une transaction. Les applications de mauvaise conception font une grande utilisation du concept de verrouillage de la base de données :) !! Afin d'éviter le concentré de verrouillage sur votre mise en page FK et de données.

Tout est sur l'acide : - Lisez ceci et cela vous effacera! L'acide est un ensemble de propriétés que vous souhaitez appliquer lors de la modification d'une base de données.

  • ** atomicité
  • Cohérence
  • Isolation
  • Durabilité**

Une transaction est un ensemble de modifications connexes utilisées pour atteindre certaines des propriétés acides. Les transactions sont des outils pour atteindre les propriétés acides.

L'atomicité signifie que vous pouvez garantir que toute une transaction se produit, ou rien de tout cela ne le fait; Vous pouvez effectuer des opérations complexes comme une seule unité, tout ou rien, et un crash, une panne de courant, une erreur ou tout autre chose ne vous permettront pas d'être dans un état dans lequel seuls les changements connexes sont arrivés.

La consistance signifie que vous garantissez que vos données seront cohérentes; Aucune des contraintes que vous avez sur les données connexes ne sera jamais violée.

L'isolement signifie qu'une transaction ne peut pas lire les données d'une autre transaction qui n'est pas encore terminée. Si deux transactions sont en cours d'exécution simultanément, chacun verra le monde comme s'il exécutait de manière séquentielle et si l'on doit lire des données écrites par une autre, elle devra attendre que l'autre soit terminée.

La durabilité signifie qu'une fois la transaction terminée, il est garanti que toutes les modifications ont été enregistrées sur un support durable (tel qu'un disque dur), et le fait que la transaction soit terminée est également enregistrée.

Ainsi, les transactions sont un mécanisme permettant de garantir ces propriétés; Ils constituent un moyen de regrouper des actions connexes ensemble de telle sorte que dans son ensemble, un groupe d'opérations peut être atomique, produire des résultats cohérents, être isolés d'autres opérations et être enregistré durablement.

0
Up_One