{"id":5360,"date":"2026-03-09T13:02:18","date_gmt":"2026-03-09T20:02:18","guid":{"rendered":"https:\/\/www.sqlskills.com\/blogs\/paul\/?p=5360"},"modified":"2026-03-09T13:02:18","modified_gmt":"2026-03-09T20:02:18","slug":"the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/","title":{"rendered":"The SQL Server Transaction Log, Part 3: The Circular Nature of the Log"},"content":{"rendered":"<p style=\"text-align: justify;\"><em>(This post first appeared on SQLperformance.com four years ago as part of a blog series, before that website was mothballed later in 2022 and the series was curtailed. Reposted here with permission, with a few tweaks.)<\/em><\/p>\n<p style=\"text-align: justify;\">In the\u00a0<a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-2-log-architecture\/\" target=\"_blank\" rel=\"noopener\">second part<\/a>\u00a0of this series, I described the structural hierarchy of the transaction log. As this post is chiefly concerned with the Virtual Log Files (VLFs) I described, I recommend you read the second part before continuing.<\/p>\n<p style=\"text-align: justify;\">When all is well, the transaction log will endlessly loop, reusing the existing VLFs. This behavior is what I call the\u00a0<em>circular nature of the log<\/em>. Sometimes, however, something will happen to prevent this, and the transaction log grows and grows, adding more and more VLFs. In this post, I\u2019ll explain how all this works, or sometimes doesn\u2019t.<\/p>\n<h2 style=\"text-align: justify;\">VLFs and Log Truncation<\/h2>\n<p style=\"text-align: justify;\">All VLFs have a header structure containing metadata about the VLF. One of the most important fields in the structure is the status of the VLF, and the values we\u2019re interested in are zero, meaning the VLF is\u00a0<em>inactive<\/em>, and two, meaning the VLF is\u00a0<em>active<\/em>. It\u2019s important because an inactive VLF can be reused, but an active one cannot. Note that a VLF is wholly active or wholly inactive.<\/p>\n<p style=\"text-align: justify;\">A VLF will remain active while required log records are in it, so it can\u2019t be reused and overwritten (I\u2019ll cover log records themselves next time). Examples of reasons why log records may be required include:<\/p>\n<ul style=\"text-align: justify;\">\n<li>There\u2019s a long-running transaction the log records are part of, so they cannot be released until the transaction has committed or has finished rolling back<\/li>\n<li>A log backup hasn\u2019t yet backed up those log records<\/li>\n<li>That portion of the log has not yet been processed by the Log Reader Agent for transactional replication or Change Data Capture<\/li>\n<li>That portion of the log hasn\u2019t yet been sent to an asynchronous database mirror or availability group replica<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">It\u2019s important to note that if there are no reasons for a VLF to remain active, it won\u2019t switch to being inactive again until a process called\u00a0<em>log truncation<\/em>\u00a0occurs \u2013 more on this below.<\/p>\n<p style=\"text-align: justify;\">Using a simple hypothetical transaction log with only five VLFs and VLF sequence numbers starting at 1 (remember from last time that in reality, they never do), when the transaction log is created, VFL 1 is immediately marked as active, as there always has to be at least one active VLF in the transaction log\u2014the VLF where log blocks are currently being written to. Our example scenario is shown in Figure 1 below.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1.png\"><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-5361 size-large\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1-1024x142.png\" alt=\"\" width=\"640\" height=\"89\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1-1024x142.png 1024w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1-300x42.png 300w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1-768x107.png 768w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1.png 1030w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><em class=\"caption\">(Figure 1: Hypothetical, brand-new transaction log with 5 VLFs, sequence numbers 1 through 5 (my image))<\/em><\/p>\n<p style=\"text-align: justify;\">As more log records are created, and more log blocks are written to the transaction log, VLF 1 fills up, so VLF 2 has to become active for more log blocks to be written to, as shown in Figure 2 below.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure2.png\"><img decoding=\"async\" class=\"alignnone wp-image-5362 size-large\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure2-1024x219.png\" alt=\"\" width=\"640\" height=\"137\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure2-1024x219.png 1024w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure2-300x64.png 300w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure2-768x164.png 768w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure2.png 1030w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><em class=\"caption\">(Figure 2: Activity moves through the transaction log (my image))<\/em><\/p>\n<p style=\"text-align: justify;\">SQL Server tracks the start of the oldest uncommitted (active) transaction, and this LSN is persisted on disk every time a checkpoint operation occurs. The LSN of the most recent log record written to the transaction log is also tracked, but it\u2019s only tracked in memory as there\u2019s no way to persist it disk without running into various race conditions. That doesn\u2019t matter as it\u2019s only used during crash recovery, and SQL Server can work out the LSN of the \u201cend\u201d of the transaction log during crash recovery. Checkpoints and crash recovery are topics for future posts in the series.<\/p>\n<p style=\"text-align: justify;\">Eventually, VLF 2 will fill up, and VLF 3 will become active, and so on. The crux of the circular nature of the transaction log is that earlier VLFs in the transaction log become inactive so they can be reused. This is done by a process called\u00a0<em>log truncation<\/em>, which is also commonly called\u00a0<em>log clearing<\/em>. Unfortunately, both of these terms are terrible misnomers because nothing is actually truncated or cleared.<\/p>\n<p style=\"text-align: justify;\">Log truncation is simply the process of examining all the VLFs in the transaction log and determining which active VLFs can now be marked as inactive again, as none of their contents are still required by SQL Server. When log truncation is performed, there\u2019s no guarantee any active VLFs can be made inactive\u2014it entirely depends on what\u2019s happening with the database.<\/p>\n<p style=\"text-align: justify;\">There are two common misconceptions about log truncation:<\/p>\n<ol style=\"text-align: justify;\">\n<li>The transaction log gets smaller (the \u201ctruncation\u201d misconception). No, it doesn\u2019t \u2013 there\u2019s no size change from log truncation. The only thing capable of making the transaction log smaller is an explicit DBCC SHRINKFILE.<\/li>\n<li>The inactive VLFs are zeroed out in some way (the \u201cclearing\u201d misconception). No \u2013 nothing is written to the VLF when it\u2019s made inactive except for a few fields in the VLF header.<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Figure 3 below shows our transaction log where VLFs 3 and 4 are active, and log truncation was able to mark VLFs 1 and 2 inactive.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure3.png\"><img decoding=\"async\" class=\"alignnone wp-image-5363 size-large\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure3-1024x219.png\" alt=\"\" width=\"640\" height=\"137\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure3-1024x219.png 1024w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure3-300x64.png 300w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure3-768x165.png 768w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure3.png 1031w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><em class=\"caption\">(Figure 3: Log truncation marks earlier VLFs as inactive (my image))<\/em><\/p>\n<p style=\"text-align: justify;\">When log truncation occurs depends on which recovery model is in use for the database:<\/p>\n<ul style=\"text-align: justify;\">\n<li>Simple model: log truncation occurs when a checkpoint operation completes<\/li>\n<li>Full model or bulk-logged model: log truncation occurs when a log backup completes (as long as there isn\u2019t a concurrent full or differential backup running, in which case log truncation is deferred until the data backup completes)<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">There are no exceptions to this.<\/p>\n<h2 style=\"text-align: justify;\">Circular Nature of the Log<\/h2>\n<p style=\"text-align: justify;\">To avoid the transaction log having to grow, log truncation must be able to mark VLFs inactive. The first physical VLF in the log must be inactive for the transaction log to have its circular nature.<\/p>\n<p style=\"text-align: justify;\">Consider Figure 4 below, which shows VLFs 4 and 5 are in use and log truncation has marked VLFs 1 through 3 as inactive. More log records are generated, more log blocks are written into VLF 5, and eventually, it fills up.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5364 size-large\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure4-1024x214.png\" alt=\"\" width=\"640\" height=\"134\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure4-1024x214.png 1024w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure4-300x63.png 300w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure4-768x160.png 768w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure4.png 1034w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><em class=\"caption\">(Figure 4: Activity fills up the highest physical VLF in the transaction log (my image))<\/em><\/p>\n<p style=\"text-align: justify;\">At this point, the log manager for the database looks at the status of the first physical VLF in the transaction log, which in our example is VLF 1, with sequence number 1. VLF 1 is inactive, so the transaction log can wrap around and begin filling again from the start. The log manager changes the first VLF to active and increases its sequence number to be one higher than the current highest VLF sequence number. So it becomes VLF 6, and logging continues with log block being written into that VLF. This is the circular nature of the log, as shown below in Figure 5.<\/p>\n<p style=\"text-align: justify;\"><a href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5365 size-large\" src=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure5-1024x251.png\" alt=\"\" width=\"640\" height=\"157\" srcset=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure5-1024x251.png 1024w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure5-300x73.png 300w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure5-768x188.png 768w, https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure5.png 1030w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p style=\"text-align: justify;\"><em class=\"caption\">(Figure 5: The circular nature of the transaction log and VLF reuse (my image))<\/em><\/p>\n<h2 style=\"text-align: justify;\">When Things Go Wrong<\/h2>\n<p style=\"text-align: justify;\">When the first physical VLF in the transaction log isn\u2019t inactive, the transaction log cannot wrap around, so it will grow (as long as it\u2019s configured to do so and there is sufficient disk space). This often happens because there\u2019s something preventing log truncation from deactivating VLFs. If you find the transaction log for a database is growing, you can query SQL Server to find out if there\u2019s a log truncation problem using this simple code below:<\/p>\n<pre lang=\"tsql\">SELECT [log_reuse_wait_desc]\r\nFROM [master].[sys].[databases]\r\nWHERE [name] = N'MyDatabase';\r\n<\/pre>\n<p style=\"text-align: justify;\">If log truncation was able to deactivate one or more VLFs, then the result will be\u00a0<em>NOTHING. Otherwise<\/em>, you\u2019ll be given a reason why log truncation couldn\u2019t deactivate any VLFs. There is a long list of possible reasons described\u00a0<a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/logs\/the-transaction-log-sql-server?view=sql-server-ver17#factors-that-can-delay-log-truncation\" target=\"_blank\" rel=\"noopener\">here<\/a>\u00a0in the section\u00a0<em>Factors that can delay log truncation.<\/em><\/p>\n<p style=\"text-align: justify;\">It\u2019s important to understand the semantics of what the result is: it\u2019s the reason log truncation couldn\u2019t do anything\u00a0<em>the last time it tried to run<\/em>. For instance, the result might be\u00a0<em>ACTIVE_BACKUP_OR_RESTORE,<\/em>\u00a0but you know that that long-running full backup has finished. This just means that the last time log truncation was attempted, the backup was still running.<\/p>\n<p style=\"text-align: justify;\">In my experience, the most common reason for log truncation being prevented is\u00a0<em>LOG_BACKUP<\/em>; i.e., go perform a log backup! But there\u2019s also an interesting, weird behavior with<em>\u00a0LOG_BACKUP<\/em>. If you continually see the result\u00a0<em>LOG_BACKUP<\/em>\u00a0but you know log backups are happening successfully, it\u2019s because there is very little activity in the database and the current VLF is the same as it was the last time a log backup was performed. So,\u00a0<em>LOG_BACKUP<\/em>\u00a0means \u201cgo perform a log backup\u201d or \u201call of the log records backed up are from the current VLF, so it couldn\u2019t be deactivated.\u201d When the latter happens, it can be confusing.<\/p>\n<h2 style=\"text-align: justify;\">Circling Back&#8230;<\/h2>\n<p style=\"text-align: justify;\">Maintaining the circular nature of the transaction log is very important to avoid costly log growths and the need to take corrective action. Usually, this means ensuring log backups are happening regularly to facilitate log truncation and sizing the transaction log to be able to hold any large, long-running operations like index rebuilds or ETL operations without log growth occurring.<\/p>\n<p style=\"text-align: justify;\">In the next part of the series, I\u2019ll cover log records, how they work, and some interesting examples.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(This post first appeared on SQLperformance.com four years ago as part of a blog series, before that website was mothballed later in 2022 and the series was curtailed. Reposted here with permission, with a few tweaks.) In the\u00a0second part\u00a0of this series, I described the structural hierarchy of the transaction log. As this post is chiefly [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[98],"tags":[],"class_list":["post-5360","post","type-post","status-publish","format-standard","hentry","category-transaction-log"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>The SQL Server Transaction Log, Part 3: The Circular Nature of the Log - Paul S. Randal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The SQL Server Transaction Log, Part 3: The Circular Nature of the Log - Paul S. Randal\" \/>\n<meta property=\"og:description\" content=\"(This post first appeared on SQLperformance.com four years ago as part of a blog series, before that website was mothballed later in 2022 and the series was curtailed. Reposted here with permission, with a few tweaks.) In the\u00a0second part\u00a0of this series, I described the structural hierarchy of the transaction log. As this post is chiefly [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/\" \/>\n<meta property=\"og:site_name\" content=\"Paul S. Randal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-09T20:02:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1030\" \/>\n\t<meta property=\"og:image:height\" content=\"143\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Paul Randal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paul Randal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/\",\"name\":\"The SQL Server Transaction Log, Part 3: The Circular Nature of the Log - Paul S. Randal\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1-1024x142.png\",\"datePublished\":\"2026-03-09T20:02:18+00:00\",\"author\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#primaryimage\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1.png\",\"contentUrl\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1.png\",\"width\":1030,\"height\":143},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The SQL Server Transaction Log, Part 3: The Circular Nature of the Log\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#website\",\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/\",\"name\":\"Paul S. Randal\",\"description\":\"In Recovery...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce\",\"name\":\"Paul Randal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g\",\"caption\":\"Paul Randal\"},\"sameAs\":[\"http:\/\/3.209.169.194\/blogs\/paul\"],\"url\":\"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The SQL Server Transaction Log, Part 3: The Circular Nature of the Log - Paul S. Randal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/","og_locale":"en_US","og_type":"article","og_title":"The SQL Server Transaction Log, Part 3: The Circular Nature of the Log - Paul S. Randal","og_description":"(This post first appeared on SQLperformance.com four years ago as part of a blog series, before that website was mothballed later in 2022 and the series was curtailed. Reposted here with permission, with a few tweaks.) In the\u00a0second part\u00a0of this series, I described the structural hierarchy of the transaction log. As this post is chiefly [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/","og_site_name":"Paul S. Randal","article_published_time":"2026-03-09T20:02:18+00:00","og_image":[{"width":1030,"height":143,"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1.png","type":"image\/png"}],"author":"Paul Randal","twitter_misc":{"Written by":"Paul Randal","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/","name":"The SQL Server Transaction Log, Part 3: The Circular Nature of the Log - Paul S. Randal","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#primaryimage"},"image":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#primaryimage"},"thumbnailUrl":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1-1024x142.png","datePublished":"2026-03-09T20:02:18+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#primaryimage","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1.png","contentUrl":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-content\/uploads\/2026\/03\/Figure1.png","width":1030,"height":143},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/the-sql-server-transaction-log-part-3-the-circular-nature-of-the-log\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/paul\/"},{"@type":"ListItem","position":2,"name":"The SQL Server Transaction Log, Part 3: The Circular Nature of the Log"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/paul\/","name":"Paul S. Randal","description":"In Recovery...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/paul\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/ffcec826c18782e1e0adf173826a7fce","name":"Paul Randal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/paul\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0b6a266bba2f088f2551ef529293001bd73bf026bc1908b9866728c062beeeb6?s=96&d=mm&r=g","caption":"Paul Randal"},"sameAs":["http:\/\/3.209.169.194\/blogs\/paul"],"url":"https:\/\/www.sqlskills.com\/blogs\/paul\/author\/paul\/"}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/5360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/comments?post=5360"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/posts\/5360\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/media?parent=5360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/categories?post=5360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/paul\/wp-json\/wp\/v2\/tags?post=5360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}