Je suis un débutant en transaction, juste une question sur le journal des transactions. Nous savons que lorsque nous validons une transaction, les modifications sont écrites dans le journal des transactions, mais le journal des transactions est-il dans RAM ou fichiers physiques? S'il est dans RAM = et lorsque la défaillance du système se produit, évidemment le RAM sera effacé pour que nous perdions les informations de transaction, alors comment récupérer le commit?
Vous pouvez trouver un joli guide complet de cette question ici , mais pour résumer, SQL Server ne rendra pas le contrôle à l'application qui a validé une transaction tant que cette transaction n'a pas été durcie sur le disque. Plus précisément, une fois qu'il a été durci dans le fichier journal des transactions, le contrôle peut être retourné.
À ce stade, les données peuvent ne pas être renforcées dans le fichier de données, elles peuvent toujours se trouver dans le cache du tampon de données, mais comme elles ont été renforcées dans le journal des transactions, la récupération de la base de données, en cas d'échec, peut récupérer ce transaction et conserver les modifications en toute sécurité.
Il existe un cache de tampon de journal en mémoire utilisé pour réduire les impacts sur les performances des écritures séquentielles dans les journaux de transactions. Le tampon est vidé sur le disque sous plusieurs conditions, mais l'une d'elles est une validation de transaction. Tant que ces données n'ont pas été renforcées, le contrôle n'est pas retourné à l'appelant, donc même si vous avez un échec lors de ce vidage de tampon, la cohérence transactionnelle est maintenue car cette transaction n'est pas encore considérée comme validée. Vous perdrez les modifications de données dans cette transaction, mais comme elle n'a pas été validée, votre application considérera déjà ces modifications comme perdues car la validation n'a jamais été terminée.
Une base de données est constituée de deux fichiers, un fichier de données et un fichier journal des transactions. Ceux-ci sont stockés sur disque.
Chaque base de données possède un cache de journaux en RAM, lorsqu'une transaction est validée, elle est déplacée vers le cache de journaux en attendant d'être vidée sur le disque. Par conséquent, temporairement, lorsqu'une transformation a été validée et attend d'être nettoyée sur le disque, elle est en mémoire, mais elle est finalement stockée sur disque dans le fichier, pas en RAM.
Je simplifie trop ici, je vous suggère de lire les journaux de transactions, je recommande ici une des conférences de Paul Randals
Comme écrit par les autres personnes, le journal des transactions sera toujours écrit sur le disque, avant qu'un COMMIT
ne revienne à votre application. Pour cette raison, le fichier journal doit toujours être placé sur un SSD rapide.
Mais par souci d'exhaustivité: avec au moins Windows Server 2016 plus SQL Server 2016, vous pouvez ajouter des NVDIMM (DIMM non volatile = Flash ou RAM sauvegardée par batterie) à votre serveur. Dans ce cas, SQL Server utiliserait ces NVDIMM pour placer la queue du journal des transactions "à chaud" sur les NVDIMM, car ils survivent à un événement de mise hors tension par définition.
Cela augmenterait considérablement la vitesse d'écriture (puisque RAM est beaucoup plus rapide que même un SSD), mais vous ne le mentionnerez que sur une base de données avec de nombreuses petites écritures/validations (par exemple, la base de données derrière un boutique en ligne occupée ou un jeu en ligne avec de nombreux joueurs simultanés).