On rencontre souvent cette situation dans la base de données : une table principale A et une sous-table B. La table B contient la clé primaire de la table A comme clé étrangère. Lorsque nous voulons insérer des données, nous allons d'abord les insérer dans le tableau A, puis obtenir l'identité du tableau A, puis les insérer dans le tableau B. Si vous souhaitez effectuer une opération de suppression, supprimez d'abord la sous-table B, puis supprimez la table principale A. En programmation, les opérations sur les deux tables s'effectuent en une seule transaction.
Lorsque le système est utilisé fréquemment, les opérations d'insertion et de suppression peuvent avoir lieu en même temps. À ce stade, la transaction d'insertion placera d'abord un verrou exclusif sur la table principale A, puis accédera à la sous-table B. En même temps, la transaction de suppression placera un verrou exclusif sur la sous-table B, puis accéder au tableau principal A. La transaction d'insertion monopolisera toujours la table A, en attendant d'accéder à la table B, et la transaction de suppression monopolisera également la table B, en attendant d'accéder à la table A. Par conséquent, les deux transactions monopolisent une table l'une pour l'autre, en attendant que l'autre partie la libère. ressources, ce qui provoque une impasse.
J'ai entendu parler de trois façons de procéder :
1. Annuler la relation de clé étrangère entre les deux tables AB, de sorte que lors de la suppression de données, vous puissiez d'abord supprimer la table principale A, puis supprimer la sous-table B, de sorte que la La séquence d'accès aux transactions de ces deux opérations sur la table est cohérente.
2 Avant de supprimer les données du tableau A, utilisez d'abord une transaction pour faire pointer la clé étrangère appropriée du tableau B vers d'autres données du tableau A (par exemple, créez une ligne de données dans le tableau A et définissez la clé primaire sur 0. Cette ligne des données ne seront jamais accessibles. Effectuer une opération de suppression), éliminant ainsi la relation entre les données à supprimer dans les deux tables AB. Ensuite, vous pouvez utiliser une transaction de suppression pour supprimer d'abord les données du tableau A, puis supprimer les données du tableau B pour obtenir un accès cohérent à la table avec la transaction d'insertion et éviter un blocage.
3. Dans la relation de clé étrangère, définissez la « Règle de suppression » sur « En cascade », de sorte que la transaction de suppression n'ait besoin que de supprimer directement la table principale A, sans utiliser la sous-table B. Car une fois la règle de suppression définie en cascade, les données de la table principale sont supprimées et toutes les données associées aux clés étrangères de la sous-table sont également supprimées en même temps.
Les trois solutions ci-dessus sont toutes des suggestions données par des collègues, et je ne sais pas quelle méthode utiliser.
Je me demande s’il existe d’autres bons moyens d’éviter une impasse dans cette situation ?
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html