{"id":42573,"date":"2026-01-19T13:25:33","date_gmt":"2026-01-19T12:25:33","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=42573"},"modified":"2026-01-19T13:25:35","modified_gmt":"2026-01-19T12:25:35","slug":"postgresql-transaction-ids-and-virtual-transaction-ids","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/","title":{"rendered":"PostgreSQL: Transaction IDs and Virtual Transaction IDs"},"content":{"rendered":"\n<p>In the <a href=\"https:\/\/www.dbi-services.com\/blog\/postgresql-an-introduction-to-row-locking\/\" target=\"_blank\" rel=\"noreferrer noopener\">last post <\/a>we&#8217;ve looked at the basics when it comes to row locking in PostgreSQL and how that looks like in pg_locks. In this post we&#8217;ll look at transaction IDs and virtual transaction IDs in the area of locking.<\/p>\n\n\n\n<p>We&#8217;ll start with the same simple table as in the previous post:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1,3]; title: ; notranslate\" title=\"\">\npostgres=# create table t ( a int );\nCREATE TABLE\npostgres=# insert into t values(1);\nINSERT 0 1\n<\/pre><\/div>\n\n\n<p>The same test as last time, two transactions updating the same row:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [2,4,9,11]; title: ; notranslate\" title=\"\">\n-- session 2\npostgres=# begin;\nBEGIN\npostgres=*# update t set a = 2 where a = 1;\nUPDATE 1\npostgres=*# \n\n-- session 3\npostgres=# begin;\nBEGIN\npostgres=*# update t set a = 2 where a = 1;\n<\/pre><\/div>\n\n\n<p>In the first session we look at pg_locks again but this time we&#8217;re only interested in lock types &#8220;virtualxid&#8221; and &#8220;transactionid&#8221;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1]; title: ; notranslate\" title=\"\">\npostgres=# select locktype,database::regdatabase,relation::regclass,pid,mode,granted,waitstart,transactionid,virtualxid from pg_locks where pid != pg_backend_pid() and locktype in (&#039;virtualxid&#039;,&#039;transactionid&#039;) order by pid;\n   locktype    | database | relation | pid  |     mode      | granted |           waitstart           | transactionid | virtualxid \n---------------+----------+----------+------+---------------+---------+-------------------------------+---------------+------------\n virtualxid    |          |          | 1809 | ExclusiveLock | t       |                               |               | 9\/2\n transactionid |          |          | 1809 | ExclusiveLock | t       |                               |           857 | \n virtualxid    |          |          | 2142 | ExclusiveLock | t       |                               |               | 18\/2\n transactionid |          |          | 2142 | ShareLock     | f       | 2026-01-19 12:54:25.658982+01 |           857 | \n transactionid |          |          | 2142 | ExclusiveLock | t       |                               |           858 | \n(5 rows)\n<\/pre><\/div>\n\n\n<p>What we can see here is that both sessions have an exclusive lock on their on virtual transaction ID and on their own transaction ID, which makes sense as noone else must do anything with those. The second session however also tries to get a &#8220;ShareLock&#8221; on the other sessions transaction ID (which is 857). This, of course, will block as this transaction needs to wait until the first one (857) either commits or rollbacks. As soon as that happens:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [2]; title: ; notranslate\" title=\"\">\n-- session 2\npostgres=*# commit;\nCOMMIT\n<\/pre><\/div>\n\n\n<p>\u2026 that lock goes away and we only see the two locks of the remaining session.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1]; title: ; notranslate\" title=\"\">\n-- session 1\npostgres=# select locktype,database::regdatabase,relation::regclass,pid,mode,granted,waitstart,transactionid,virtualxid from pg_locks where pid != pg_backend_pid() and locktype in (&#039;virtualxid&#039;,&#039;transactionid&#039;) order by pid;\n   locktype    | database | relation | pid  |     mode      | granted | waitstart | transactionid | virtualxid \n---------------+----------+----------+------+---------------+---------+-----------+---------------+------------\n virtualxid    |          |          | 2142 | ExclusiveLock | t       |           |               | 18\/2\n transactionid |          |          | 2142 | ExclusiveLock | t       |           |           858 | \n(2 rows)\n<\/pre><\/div>\n\n\n<p>The question is: What is a virtual transaction ID? The answer is in the <a href=\"https:\/\/www.postgresql.org\/docs\/current\/transaction-id.html\" target=\"_blank\" rel=\"noreferrer noopener\">documentation<\/a>, for short: To prevent burning real transaction IDs when it is not required, each transaction gets it&#8217;s own virtual transaction ID. Only when the transaction makes changes to the database a real transaction ID will be assigned. If the whole transaction is read only, this assignment never happens.<\/p>\n\n\n\n<p>We can demonstrate that easily using the first and second session. Currently we do not see anything in pg_locks in the first session as no transaction is running (session three has committed in the meantime):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [1]; title: ; notranslate\" title=\"\">\npostgres=# select locktype,database::regdatabase,relation::regclass,pid,mode,granted,waitstart,transactionid,virtualxid from pg_locks where pid != pg_backend_pid() and locktype in (&#039;virtualxid&#039;,&#039;transactionid&#039;) order by pid;\n locktype | database | relation | pid | mode | granted | waitstart | transactionid | virtualxid \n----------+----------+----------+-----+------+---------+-----------+---------------+------------\n(0 rows)\n<\/pre><\/div>\n\n\n<p>In the second session we start a transaction and check the contents of our test table:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [2,4]; title: ; notranslate\" title=\"\">\n-- session 2\npostgres=# begin;\nBEGIN\npostgres=*# select * from t;\n a \n---\n 2\n(1 row)\n\npostgres=*# \n<\/pre><\/div>\n\n\n<p>Back to session one, what do we see?<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [2]; title: ; notranslate\" title=\"\">\n-- session 1\npostgres=# select locktype,database::regdatabase,relation::regclass,pid,mode,granted,waitstart,transactionid,virtualxid from pg_locks where pid != pg_backend_pid() and locktype in (&#039;virtualxid&#039;,&#039;transactionid&#039;) order by pid;\n  locktype  | database | relation | pid  |     mode      | granted | waitstart | transactionid | virtualxid \n------------+----------+----------+------+---------------+---------+-----------+---------------+------------\n virtualxid |          |          | 1809 | ExclusiveLock | t       |           |               | 9\/3\n(1 row)\n<\/pre><\/div>\n\n\n<p>The session only show up with a lock on it&#8217;s virtual transaction ID because we did not change anything in the database. As soon as we do this:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [2,4]; title: ; notranslate\" title=\"\">\n-- session 2\npostgres=*# insert into t values(3);\nINSERT 0 1\npostgres=*# select * from t;\n a \n---\n 2\n 3\n(2 rows)\n<\/pre><\/div>\n\n\n<p>\u2026 we get a second row in pg_locks and the real transaction ID shows up. As before, both are protected by an &#8220;ExclusiveLock&#8221;:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; highlight: [2]; title: ; notranslate\" title=\"\">\n-- session 1\npostgres=# select locktype,database::regdatabase,relation::regclass,pid,mode,granted,waitstart,transactionid,virtualxid from pg_locks where pid != pg_backend_pid() and locktype in (&#039;virtualxid&#039;,&#039;transactionid&#039;) order by pid;\n   locktype    | database | relation | pid  |     mode      | granted | waitstart | transactionid | virtualxid \n---------------+----------+----------+------+---------------+---------+-----------+---------------+------------\n virtualxid    |          |          | 1809 | ExclusiveLock | t       |           |               | 9\/3\n transactionid |          |          | 1809 | ExclusiveLock | t       |           |           859 | \n(2 rows)\n<\/pre><\/div>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the last post we&#8217;ve looked at the basics when it comes to row locking in PostgreSQL and how that looks like in pg_locks. In this post we&#8217;ll look at transaction IDs and virtual transaction IDs in the area of locking. We&#8217;ll start with the same simple table as in the previous post: The same [&hellip;]<\/p>\n","protected":false},"author":29,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229,198],"tags":[77],"type_dbi":[],"class_list":["post-42573","post","type-post","status-publish","format-standard","hentry","category-database-administration-monitoring","category-database-management","tag-postgresql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>PostgreSQL: Transaction IDs and Virtual Transaction IDs - dbi Blog<\/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.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL: Transaction IDs and Virtual Transaction IDs\" \/>\n<meta property=\"og:description\" content=\"In the last post we&#8217;ve looked at the basics when it comes to row locking in PostgreSQL and how that looks like in pg_locks. In this post we&#8217;ll look at transaction IDs and virtual transaction IDs in the area of locking. We&#8217;ll start with the same simple table as in the previous post: The same [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-19T12:25:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-19T12:25:35+00:00\" \/>\n<meta name=\"author\" content=\"Daniel Westermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@westermanndanie\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel Westermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/\"},\"author\":{\"name\":\"Daniel Westermann\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"headline\":\"PostgreSQL: Transaction IDs and Virtual Transaction IDs\",\"datePublished\":\"2026-01-19T12:25:33+00:00\",\"dateModified\":\"2026-01-19T12:25:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/\"},\"wordCount\":368,\"commentCount\":0,\"keywords\":[\"PostgreSQL\"],\"articleSection\":[\"Database Administration &amp; Monitoring\",\"Database management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/\",\"name\":\"PostgreSQL: Transaction IDs and Virtual Transaction IDs - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"datePublished\":\"2026-01-19T12:25:33+00:00\",\"dateModified\":\"2026-01-19T12:25:35+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL: Transaction IDs and Virtual Transaction IDs\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66\",\"name\":\"Daniel Westermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g\",\"caption\":\"Daniel Westermann\"},\"description\":\"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.\",\"sameAs\":[\"https:\/\/x.com\/westermanndanie\"],\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"PostgreSQL: Transaction IDs and Virtual Transaction IDs - dbi Blog","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.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/","og_locale":"en_US","og_type":"article","og_title":"PostgreSQL: Transaction IDs and Virtual Transaction IDs","og_description":"In the last post we&#8217;ve looked at the basics when it comes to row locking in PostgreSQL and how that looks like in pg_locks. In this post we&#8217;ll look at transaction IDs and virtual transaction IDs in the area of locking. We&#8217;ll start with the same simple table as in the previous post: The same [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/","og_site_name":"dbi Blog","article_published_time":"2026-01-19T12:25:33+00:00","article_modified_time":"2026-01-19T12:25:35+00:00","author":"Daniel Westermann","twitter_card":"summary_large_image","twitter_creator":"@westermanndanie","twitter_misc":{"Written by":"Daniel Westermann","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/"},"author":{"name":"Daniel Westermann","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"headline":"PostgreSQL: Transaction IDs and Virtual Transaction IDs","datePublished":"2026-01-19T12:25:33+00:00","dateModified":"2026-01-19T12:25:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/"},"wordCount":368,"commentCount":0,"keywords":["PostgreSQL"],"articleSection":["Database Administration &amp; Monitoring","Database management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/","url":"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/","name":"PostgreSQL: Transaction IDs and Virtual Transaction IDs - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2026-01-19T12:25:33+00:00","dateModified":"2026-01-19T12:25:35+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/postgresql-transaction-ids-and-virtual-transaction-ids\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL: Transaction IDs and Virtual Transaction IDs"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d08e9bd996a89bd75c0286cbabf3c66","name":"Daniel Westermann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/31350ceeecb1dd8986339a29bf040d4cd3cd087d410deccd8f55234466d6c317?s=96&d=mm&r=g","caption":"Daniel Westermann"},"description":"Daniel Westermann is Principal Consultant and Technology Leader Open Infrastructure at dbi services. He has more than 15 years of experience in management, engineering and optimization of databases and infrastructures, especially on Oracle and PostgreSQL. Since the beginning of his career, he has specialized in Oracle Technologies and is Oracle Certified Professional 12c and Oracle Certified Expert RAC\/GridInfra. Over time, Daniel has become increasingly interested in open source technologies, becoming \u201cTechnology Leader Open Infrastructure\u201d and PostgreSQL expert. \u00a0Based on community or EnterpriseDB tools, he develops and installs complex high available solutions with PostgreSQL. He is also a certified PostgreSQL Plus 9.0 Professional and a Postgres Advanced Server 9.4 Professional. He is a regular speaker at PostgreSQL conferences in Switzerland and Europe. Today Daniel is also supporting our customers on AWS services such as AWS RDS, database migrations into the cloud, EC2 and automated infrastructure management with AWS SSM (System Manager). He is a certified AWS Solutions Architect Professional. Prior to dbi services, Daniel was Management System Engineer at LC SYSTEMS-Engineering AG in Basel. Before that, he worked as Oracle Developper &amp;\u00a0Project Manager at Delta Energy Solutions AG in Basel (today Powel AG). Daniel holds a diploma in Business Informatics (DHBW, Germany). His branch-related experience mainly covers the pharma industry, the financial sector, energy, lottery and telecommunications.","sameAs":["https:\/\/x.com\/westermanndanie"],"url":"https:\/\/www.dbi-services.com\/blog\/author\/daniel-westermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/42573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/29"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=42573"}],"version-history":[{"count":6,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/42573\/revisions"}],"predecessor-version":[{"id":42579,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/42573\/revisions\/42579"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=42573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=42573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=42573"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=42573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}