2009-06-04 6 views
2

J'ai un applicaton dotnet qui exécute un ensemble d'insertion, mise à jour, supprimer des déclarations de manière transactionalySql effectue-t-il une restauration implicite si mon délai de restauration est dépassé?

Le code est comme ce

try 
{ 
mytrans = mycon.begintransaction(); 
//execute sql statements 
mytrans.commit(); 
} 
catch(Exception) 
{ 
mytrans.rollback(); 
} 

Le problème est que nous avons été confrontés parfois des exceptions de délai d'attente dans rollback et je trouvé que la taille de la base de données (fichier mdf) a augmenté !!! Cela signifie donc que Sql ne fera pas de rollback implicite? Si oui, comment puis-je récupérer de cette erreur et aller à l'état d'origine ???

Répondre

2

Le concept fondamental des transactions exige que les transactions qui ne sont pas validées n'affectent pas l'état de la base de données.

La taille du fichier ne veut rien dire. Les structures de données RDBMS sont beaucoup plus complexes que la simple addition d'une ligne à un fichier - elles incluent des journaux et des index, de sorte que le fichier peut grossir et se rétrécir de façon assez indépendante de la quantité de données dans la base de données.

+0

Cela signifie donc que la transaction qui n'est pas validée sera implicitement rollback, n'est-ce pas? if so Quel est le but de la méthode de restauration –

+0

Oui, une transaction qui n'est pas validée est implicitement annulée lorsque la connexion à la base de données est fermée (éventuellement par un dépassement de délai). Le but de la méthode de restauration est de donner le contrôle à votre programme, car il peut y avoir des situations où une annulation est causée non pas par des problèmes techniques mais par la logique du programme: le programme lance une transaction, fait des choses, puis décide de revenir la transaction et faire quelque chose d'autre à la place en utilisant le même DB connectionc. –

+0

Ok mais ma logique dit d'abord que je déplace les tables actuelles vers les tables hisoriques et que je fais un traitement lors de ce déplacement. J'ai été confronté à une exception de violation de clé primaire. table historique spécifique !!! cela signifie que le sql n'a pas réussi à revenir en arrière (je pense) –

1

Tout SQL pouvant avoir été exécuté n'a pas encore été validé. Si votre Rollback, pour quelque raison que ce soit, n'expire pas. D'où finalement la DB réalisera son pearshaped tout passé et rejettera les changements.

Une augmentation de la taille du MDF n'indique pas que la transaction a été validée. Cependant, les résultats de la transaction doivent être mis quelque part. La validation de la transaction devrait nécessiter la plus petite modification possible dans la base de données. Ainsi, les pages peuvent être allouées et les données écrites, puis sur commettre juste quelques autres bits pointant dans tous les bons endroits sont modifiés.

S'il y a un retour en arrière, ces derniers bits ne sont pas modifiés et ces pages allouées deviennent simplement des pages libres à utiliser pour d'autres choses. Vous ne pouvez pas vous attendre à ce que la base de données soit à nouveau réduite.

0

Une fois qu'un Rollback a commencé il DOIT remplir. Si vous êtes toujours connecté ou non, SQL Server terminera toujours la restauration. Si vous ne terminez pas une restauration, votre base de données est corrompue et nécessite une récupération.

Questions connexes