Vous pouvez trouver un guide assez complet sur 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 parce qu'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 de 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
https://youtu.be/LvlFgxZZOj4
la source
Comme écrit par les autres personnes, le journal des transactions sera toujours écrit sur le disque, avant un
COMMIT
retour de contrôle à 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 (car la 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 une boutique en ligne occupée ou un jeu en ligne avec de nombreux joueurs concurrents).
la source