Si une transaction est «validée», est-elle alors enregistrée à coup sûr?

12

Si une transaction est validée avec succès, puis-je être sûr à 100% qu'elle a été écrite dans la base de données ET dans les fichiers journaux? Puis-je être sûr que les données sont enregistrées?

Aujourd'hui, nos fichiers journaux avaient atteint la limite du lecteur et nous avons eu beaucoup d'erreurs. De plus, certains autres services se sont écrasés. Nous avons augmenté le disque et redémarré le serveur.

Au démarrage, le serveur a fait une "récupération de base de données" - puis-je être sûr que tout va bien à nouveau?

Police SQL
la source
2
Vous pouvez consulter le journal des erreurs une fois la récupération terminée pour voir combien de transactions ont été validées et combien ont été annulées. Il n'y a pas de réponse magique à cela - si un disque tombe en panne, tout dépend de l'état des transactions à ce moment-là.
Aaron Bertrand
1
@AaronBertrand Mais si une transaction est dans l'état "validée" (c'est-à-dire que la validation a réussi), comment pourrait-il alors être possible qu'elle soit toujours perdue pendant la récupération?
SQL Police du
3
@Giosco: Ce n'est pas possible. "commit" signifie qu'il se trouve dans le fichier journal de la base de données. La seule façon de le perdre après cela est soit 1) de perdre le fichier journal avant qu'il ne soit également enregistré dans le fichier de données, ou 2) de perdre à la fois le fichier journal et le fichier de données, ou 3) une erreur humaine. Notez que (3) est généralement le plus probable.
RBarryYoung
2
@Giosco comment savez-vous que toutes vos transactions au moment du disque dur ont été validées avec succès?
Aaron Bertrand
2
Procédure stockée <> transaction - votre procédure stockée peut avoir plusieurs transactions explicites, ou seulement implicites, il pourrait y avoir une logique try / catch, il pourrait y avoir une gestion des transactions au niveau de la couche C #, etc. etc. Encore une fois, en supposant qu'aucune exception = validation réussie pourrait être un peu trop dangereux comme déclaration générale.
Aaron Bertrand

Réponses:

16

Si une application cliente a émis un COMMIT et récupéré un code de réussite, la transaction est garantie par le moteur pour être durable. Il est garanti que toutes les modifications effectuées dans une transaction seront visibles, même après un crash. De plus, la récupération garantit également que toute transaction non engagée sera annulée en cas de plantage.

Pour plus de détails, je recommande de lire le document ARIES .

La journalisation et la récupération en écriture anticipée ne peuvent garantir que le matériel de stockage sous-jacent présente des défauts (corruption). Et tout produit d'ingénierie peut contenir des défauts.

Votre application, comme toutes les autres applications, doit être soigneusement écrite pour se comporter correctement en cas de plantage (erreurs). Il n'y a pas de magie.

Remus Rusanu
la source
Si une application cliente a émis un COMMIT mais qu'aucune réponse de la base de données n'est reçue avant l'expiration du côté client. Et cet engagement? succès ou échec? Comment vérifier?
Gab 是 好人