{"id":1184,"date":"2025-09-10T09:00:00","date_gmt":"2025-09-10T14:00:00","guid":{"rendered":"https:\/\/www.sqltabletalk.com\/?p=1184"},"modified":"2025-09-09T21:26:16","modified_gmt":"2025-09-10T02:26:16","slug":"common-transaction-pitfalls-oracle-to-sql-server","status":"publish","type":"post","link":"https:\/\/www.sqltabletalk.com\/?p=1184","title":{"rendered":"Common Transaction Pitfalls After Migrating from Oracle to SQL Server"},"content":{"rendered":"<p>When applications move from Oracle to SQL Server, it\u2019s common to see <strong>unexpected blocking and performance regressions<\/strong>. Most issues trace back to <strong>transaction handling differences<\/strong> and assumptions carried over from Oracle.<\/p>\n<h2>At a glance<\/h2>\n<ul>\n<li>Oracle\u2019s <strong>MVCC<\/strong> design lets <strong>readers and writers proceed without blocking<\/strong> each other.<\/li>\n<li>SQL Server\u2019s <strong>default<\/strong> is <strong>autocommit ON<\/strong> under <strong>READ COMMITTED<\/strong> isolation, implemented with <strong>locks<\/strong> (unless you enable row versioning).<\/li>\n<li>Teams sometimes try to mimic Oracle by disabling autocommit or enabling <code>IMPLICIT_TRANSACTIONS<\/code>, which can lead to <strong>long\u2011lived transactions that hold locks<\/strong>, causing blocking, deadlocks, and log growth.<\/li>\n<\/ul>\n<blockquote>\n<p><strong>Important:<\/strong> Always validate Oracle behaviors and environment\u2011specific defaults in official docs during migration planning. Oracle\u2019s concurrency model is MVCC, but <strong>autocommit is a client\/driver setting<\/strong> (see note below).<\/p>\n<\/blockquote>\n<hr \/>\n<h2>Why the mismatch happens<\/h2>\n<p><strong>Oracle (conceptual defaults):<\/strong> MVCC with <strong>READ COMMITTED<\/strong> isolation; <strong>readers don\u2019t block writers and vice versa<\/strong>, thanks to undo\/consistent read.<\/p>\n<p><strong>Note on autocommit:<\/strong> Oracle Database itself doesn\u2019t have a server\u2011wide \u201cautocommit default.\u201d Tools like <strong>SQL*Plus<\/strong> default to <strong>autocommit OFF<\/strong>, while <strong>JDBC connections default to autocommit ON<\/strong> unless changed by the app. Don\u2019t assume a single universal setting.<\/p>\n<p><strong>SQL Server defaults:<\/strong> <strong>Autocommit ON<\/strong>, <code>IMPLICIT_TRANSACTIONS<\/code> <strong>OFF<\/strong>, isolation level <strong>READ COMMITTED<\/strong> implemented with <strong>locking<\/strong>\u2014so readers and writers can <strong>block<\/strong> each other.<\/p>\n<p><strong>Common migration misstep:<\/strong> Apps ported from Oracle sometimes turn on <code>IMPLICIT_TRANSACTIONS<\/code> or disable autocommit to \u201cfeel Oracle\u2011like.\u201d On SQL Server, that choice often yields <strong>open transactions for an entire session<\/strong>, which <strong>hold locks and block others<\/strong>.<\/p>\n<hr \/>\n<h2>Why SQL Server\u2019s defaults are sensible (for SQL Server)<\/h2>\n<ul>\n<li><strong>Autocommit ON<\/strong>: Avoids forgotten, long\u2011running transactions that hold locks.<\/li>\n<li><strong>READ COMMITTED<\/strong>: Reasonable integrity (no dirty reads) with minimal overhead; switch to row\u2011versioning for higher concurrency.<\/li>\n<li><strong><code>IMPLICIT_TRANSACTIONS<\/code> OFF<\/strong>: Prevents accidental long\u2011lived transactions.<\/li>\n<\/ul>\n<hr \/>\n<h2>A pragmatic SQL Server configuration for \u201cOracle\u2011like\u201d concurrency<\/h2>\n<ol>\n<li><strong>Keep defaults<\/strong> for most workloads:\n<ul>\n<li><code>autocommit = ON<\/code><\/li>\n<li><code>IMPLICIT_TRANSACTIONS = OFF<\/code><\/li>\n<li>Default isolation = <code>READ COMMITTED<\/code> (locking by default)<\/li>\n<\/ul>\n<\/li>\n<li><strong>Enable READ_COMMITTED_SNAPSHOT (RCSI)<\/strong> to make <code>READ COMMITTED<\/code> use <strong>row versioning<\/strong> instead of reader\/writer locks:\n<pre><code class=\"language-sql\">ALTER DATABASE YourDB \n  SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;<\/code><\/pre>\n<\/li>\n<li><strong>Optionally allow SNAPSHOT isolation<\/strong> for explicit use where repeatable, statement\u2011stable reads are required:\n<pre><code class=\"language-sql\">ALTER DATABASE YourDB \n  SET ALLOW_SNAPSHOT_ISOLATION ON;<\/code><\/pre>\n<p><em>Caution:<\/em> Under SNAPSHOT, <strong>update conflicts (Msg 3960)<\/strong> can occur if two transactions try to update the same row (writers still block writers).<\/p>\n<\/li>\n<li><strong>Educate developers<\/strong>: Keep transactions short; always <code>COMMIT<\/code> or <code>ROLLBACK<\/code> promptly.<\/li>\n<\/ol>\n<hr \/>\n<h2>Where row versions live (and what to monitor)<\/h2>\n<ul>\n<li>If you enable <strong>RCSI<\/strong> or <strong>SNAPSHOT<\/strong>, SQL Server uses <strong>row versioning<\/strong>.<\/li>\n<li><strong>Without ADR<\/strong> (pre\u2011SQL Server 2019 or ADR OFF): versions live in <strong>tempdb<\/strong>.<\/li>\n<li><strong>With ADR enabled<\/strong> (SQL Server 2019+ or Azure SQL Database): row versions live in the per\u2011database <strong>Persistent Version Store (PVS)<\/strong>.<\/li>\n<\/ul>\n<p><strong>What to monitor<\/strong><\/p>\n<ul>\n<li><strong>tempdb version store usage<\/strong> (when ADR is off):\n<pre><code class=\"language-sql\">SELECT * FROM sys.dm_tran_version_store_space_usage;<\/code><\/pre>\n<\/li>\n<li><strong>PVS (when ADR is on):<\/strong>\n<pre><code class=\"language-sql\">SELECT * FROM sys.dm_tran_persistent_version_store_stats;<\/code><\/pre>\n<\/li>\n<li><strong>Long\u2011running transactions<\/strong> (they delay version cleanup and cause growth):\n<pre><code class=\"language-sql\">SELECT * FROM sys.dm_tran_active_snapshot_database_transactions;<\/code><\/pre>\n<\/li>\n<\/ul>\n<p><em>Note:<\/em> In Azure SQL Database, <strong>RCSI is enabled by default<\/strong> and <strong>ADR is always on<\/strong>&mdash;plan capacity accordingly.<\/p>\n<hr \/>\n<h2>Oracle vs. SQL Server defaults (and SQL Server + RCSI)<\/h2>\n<table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Oracle (typical)<\/th>\n<th>SQL Server (default)<\/th>\n<th>SQL Server with RCSI<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Autocommit default<\/td>\n<td>Client\/tool specific (e.g., SQL*Plus OFF; JDBC ON)<\/td>\n<td>ON<\/td>\n<td>ON<\/td>\n<\/tr>\n<tr>\n<td>Default isolation<\/td>\n<td>READ COMMITTED (MVCC)<\/td>\n<td>READ COMMITTED (locking)<\/td>\n<td>READ COMMITTED (row\u2011versioning)<\/td>\n<\/tr>\n<tr>\n<td>Concurrency model<\/td>\n<td>MVCC<\/td>\n<td>Lock\u2011based<\/td>\n<td>Row versioning<\/td>\n<\/tr>\n<tr>\n<td>Readers vs. writers<\/td>\n<td>No blocking<\/td>\n<td>Can block<\/td>\n<td>No blocking<\/td>\n<\/tr>\n<tr>\n<td>Row\u2011version storage<\/td>\n<td>Undo segments<\/td>\n<td>N\/A (locking)<\/td>\n<td><code>tempdb<\/code> (no ADR) or PVS (ADR)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<h2>Detecting \u201cimplicit transactions\u201d problems after migration<\/h2>\n<h3>Find sessions with open implicit transactions<\/h3>\n<pre><code class=\"language-sql\">;WITH implicit_tx AS\n(\n  SELECT\n      at.transaction_id,\n      at.transaction_begin_time,\n      st.session_id\n  FROM sys.dm_tran_active_transactions AS at\n  JOIN sys.dm_tran_session_transactions AS st\n    ON st.transaction_id = at.transaction_id\n  WHERE at.name = N'implicit_transaction'\n)\nSELECT\n    s.session_id,\n    s.login_name,\n    s.host_name,\n    s.program_name,\n    s.status,\n    s.open_transaction_count,\n    x.transaction_begin_time,\n    DATEDIFF(SECOND, x.transaction_begin_time, SYSUTCDATETIME()) AS open_seconds\nFROM implicit_tx AS x\nJOIN sys.dm_exec_sessions AS s\n  ON s.session_id = x.session_id\nORDER BY open_seconds DESC;<\/code><\/pre>\n<h3>Flag sleeping sessions with open transactions<\/h3>\n<pre><code class=\"language-sql\">SELECT\n  s.session_id,\n  s.login_name,\n  s.host_name,\n  s.program_name,\n  s.status,\n  s.open_transaction_count\nFROM sys.dm_exec_sessions AS s\nWHERE s.is_user_process = 1\n  AND s.status = 'sleeping'\n  AND s.open_transaction_count &gt; 0;<\/code><\/pre>\n<h3>Capture who\u2019s enabling implicit transactions (Extended Events)<\/h3>\n<p>Create a lightweight XE session to capture <code>SET<\/code> options on connect and reuse:<\/p>\n<pre><code class=\"language-sql\">CREATE EVENT SESSION [CaptureImplicitTxns] ON SERVER\nADD EVENT sqlserver.login(SET collect_options_text = (1)),\nADD EVENT sqlserver.existing_connection(SET collect_options_text = (1))\nADD TARGET package0.ring_buffer;\nALTER EVENT SESSION [CaptureImplicitTxns] ON SERVER STATE = START;<\/code><\/pre>\n<p>Then filter results for <code>options_text<\/code> containing <code>implicit_transactions on<\/code>. For ongoing analysis, prefer an <strong>event_file<\/strong> target instead of <code>ring_buffer<\/code> on busy servers.<\/p>\n<hr \/>\n<h2>Optimizing and monitoring <code>tempdb<\/code> \/ PVS<\/h2>\n<ul>\n<li><strong><code>tempdb<\/code> layout<\/strong> (if ADR is off or for other versioning features): Use <strong>multiple equally sized data files<\/strong> to reduce allocation contention. A good starting point is <strong>1 file per logical CPU up to 8<\/strong>, then grow by 4 at a time <strong>only if contention persists<\/strong>.<\/li>\n<li><strong>Instant File Initialization (IFI)<\/strong> for faster growth of <strong>data files<\/strong>, including <code>tempdb<\/code> data files (does not apply to the log): enable Windows \u201c<em>Perform volume maintenance tasks<\/em>\u201d for the SQL Server service account.<\/li>\n<li><strong>Watch version store growth<\/strong> continuously (DMVs above). Long\u2011running transactions delay cleanup and can fill <code>tempdb<\/code> or the PVS.<\/li>\n<\/ul>\n<hr \/>\n<h2>Quick commands &amp; checks<\/h2>\n<p><strong>Enable row\u2011versioning behaviors<\/strong><\/p>\n<pre><code class=\"language-sql\">-- Make READ COMMITTED use row versioning:\nALTER DATABASE YourDB \n  SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;\n\n-- Allow explicit SNAPSHOT isolation:\nALTER DATABASE YourDB \n  SET ALLOW_SNAPSHOT_ISOLATION ON;<\/code><\/pre>\n<p><strong>Confirm settings \/ environment<\/strong><\/p>\n<pre><code class=\"language-sql\">-- Per-database snapshot\/RCSI switches\nSELECT name,\n       is_read_committed_snapshot_on,\n       snapshot_isolation_state_desc\nFROM sys.databases\nWHERE name = 'YourDB';\n\n-- ADR \/ PVS signal\nSELECT name, is_accelerated_database_recovery_on\nFROM sys.databases\nWHERE name = 'YourDB';<\/code><\/pre>\n<hr \/>\n<h2>DBA checklist (post\u2011migration)<\/h2>\n<ul>\n<li>&#x2705; <strong>Decide on RCSI<\/strong> for migrated databases; test critical read\/write paths before enabling in production.<\/li>\n<li>&#x2705; <strong>Validate <code>tempdb<\/code><\/strong>:\n<ul>\n<li>Multiple equally sized data files (start with cores \u2264 8 \u2192 that many files; &gt; 8 \u2192 start with 8).<\/li>\n<li><strong>IFI<\/strong> enabled for data files.<\/li>\n<\/ul>\n<\/li>\n<li>&#x2705; If <strong>ADR<\/strong> is enabled, monitor <strong>PVS<\/strong> with <code>sys.dm_tran_persistent_version_store_stats<\/code>.<\/li>\n<li>&#x2705; Monitor version store usage in <code>tempdb<\/code> with <code>sys.dm_tran_version_store_space_usage<\/code>.<\/li>\n<li>&#x2705; Detect <strong>long\u2011running transactions<\/strong>: <code>sys.dm_tran_active_snapshot_database_transactions<\/code>.<\/li>\n<li>&#x2705; <strong>Audit implicit transactions<\/strong> with DMVs\/XE as shown above.<\/li>\n<li>&#x2705; <strong>Coach developers<\/strong> to avoid long\u2011lived transactions and always <code>COMMIT<\/code>\/<code>ROLLBACK<\/code> promptly.<\/li>\n<\/ul>\n<hr \/>\n<h2>Conclusion<\/h2>\n<p>Migrating from Oracle to SQL Server isn\u2019t just a connection\u2011string change; it\u2019s a shift in <strong>concurrency and transaction semantics<\/strong>. Oracle\u2019s MVCC generally prevents reader\/writer blocking. SQL Server\u2019s defaults are different and, if you try to emulate Oracle by disabling autocommit or enabling implicit transactions, you\u2019re likely to run into <strong>blocking and scalability issues<\/strong>.<\/p>\n<p>The pragmatic approach on SQL Server is to <strong>keep the defaults<\/strong>, enable <strong>RCSI<\/strong> for Oracle\u2011like read behavior where appropriate, and <strong>monitor<\/strong> version store usage (in <code>tempdb<\/code> or <strong>PVS<\/strong> when ADR is on). With the right configuration and developer practices, you can achieve <strong>high concurrency and predictable performance<\/strong> on SQL Server.<\/p>\n<hr \/>\n<h2>Sources &amp; further reading<\/h2>\n<ul>\n<li><strong>Oracle Database Concepts<\/strong>: Data Concurrency and Consistency; Read Consistency; Isolation Levels (default READ COMMITTED).<\/li>\n<li><strong>Microsoft Docs \u2013 SQL Server<\/strong>: Transaction Isolation Levels; Read Committed Snapshot (RCSI); Snapshot Isolation; Row Versioning behavior.<\/li>\n<li><strong>Accelerated Database Recovery (ADR)<\/strong> and <strong>Persistent Version Store (PVS)<\/strong>: Concepts, behavior, and monitoring DMVs.<\/li>\n<li><strong>DMVs<\/strong>: <code>sys.dm_tran_version_store_space_usage<\/code>, <code>sys.dm_tran_persistent_version_store_stats<\/code>, <code>sys.dm_tran_active_snapshot_database_transactions<\/code>.<\/li>\n<li><strong>Extended Events<\/strong>: <code>sqlserver.login<\/code> \/ <code>sqlserver.existing_connection<\/code> with <code>collect_options_text<\/code>; inspect <code>options_text<\/code> to compare <code>SET<\/code> options.<\/li>\n<li><strong>tempdb guidance<\/strong>: Number of data files (start up to 8 and scale as needed), instant file initialization (IFI) for data files.<\/li>\n<li><strong>Azure SQL Database<\/strong>: RCSI default ON; ADR always on.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This post explains common transaction pitfalls when migrating from Oracle to SQL Server. It highlights key differences in concurrency models, autocommit behavior, and isolation levels. Readers will learn why disabling autocommit or enabling implicit transactions can cause blocking and performance issues. The article provides guidance on enabling READ_COMMITTED_SNAPSHOT (RCSI), monitoring tempdb or Persistent Version Store (PVS), and detecting long-running transactions. A DBA checklist and best practices are included to help ensure smooth performance after migration.<\/p>\n","protected":false},"author":49,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[82,182,21],"tags":[551,636,637,633,639,635,131,390,638,640,634],"class_list":["post-1184","post","type-post","status-publish","format-standard","hentry","category-database-configuration","category-migration","category-tutorial","tag-accelerated-database-recovery","tag-implicit-transactions","tag-mvcc-vs-locking","tag-oracle-to-sql-server","tag-persistent-version-store","tag-read-committed-snapshot","tag-sql-server","tag-sql-server-migration","tag-sql-server-performance-tuning","tag-tempdb-optimization","tag-transaction-blocking"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Common Transaction Pitfalls After Migrating from Oracle to SQL Server - SQL Table Talk<\/title>\n<meta name=\"description\" content=\"This post explains common transaction pitfalls when migrating from Oracle to SQL Server. It highlights key differences in concurrency models, autocommit behavior, and isolation levels. Readers will learn why disabling autocommit or enabling implicit transactions can cause blocking and performance issues. The article provides guidance on enabling READ_COMMITTED_SNAPSHOT (RCSI), monitoring tempdb or Persistent Version Store (PVS), and detecting long-running transactions. A DBA checklist and best practices are included to help ensure smooth performance after migration.\" \/>\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.sqltabletalk.com\/?p=1184\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Common Transaction Pitfalls After Migrating from Oracle to SQL Server - SQL Table Talk\" \/>\n<meta property=\"og:description\" content=\"This post explains common transaction pitfalls when migrating from Oracle to SQL Server. It highlights key differences in concurrency models, autocommit behavior, and isolation levels. Readers will learn why disabling autocommit or enabling implicit transactions can cause blocking and performance issues. The article provides guidance on enabling READ_COMMITTED_SNAPSHOT (RCSI), monitoring tempdb or Persistent Version Store (PVS), and detecting long-running transactions. A DBA checklist and best practices are included to help ensure smooth performance after migration.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqltabletalk.com\/?p=1184\" \/>\n<meta property=\"og:site_name\" content=\"SQL Table Talk\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-10T14:00:00+00:00\" \/>\n<meta name=\"author\" content=\"Jon Russell\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jon Russell\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=1184#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=1184\"},\"author\":{\"name\":\"Jon Russell\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/8f5916388cc3b793a960dea33ff1ed86\"},\"headline\":\"Common Transaction Pitfalls After Migrating from Oracle to SQL Server\",\"datePublished\":\"2025-09-10T14:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=1184\"},\"wordCount\":987,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0\"},\"keywords\":[\"Accelerated Database Recovery\",\"implicit transactions\",\"MVCC vs locking\",\"Oracle to SQL Server\",\"Persistent Version Store\",\"READ COMMITTED SNAPSHOT\",\"SQL Server\",\"SQL Server Migration\",\"SQL Server performance tuning\",\"tempdb optimization\",\"transaction blocking\"],\"articleSection\":[\"Database Configuration\",\"Migration\",\"Tutorial\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.sqltabletalk.com\/?p=1184#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=1184\",\"url\":\"https:\/\/www.sqltabletalk.com\/?p=1184\",\"name\":\"Common Transaction Pitfalls After Migrating from Oracle to SQL Server - SQL Table Talk\",\"isPartOf\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/#website\"},\"datePublished\":\"2025-09-10T14:00:00+00:00\",\"description\":\"This post explains common transaction pitfalls when migrating from Oracle to SQL Server. It highlights key differences in concurrency models, autocommit behavior, and isolation levels. Readers will learn why disabling autocommit or enabling implicit transactions can cause blocking and performance issues. The article provides guidance on enabling READ_COMMITTED_SNAPSHOT (RCSI), monitoring tempdb or Persistent Version Store (PVS), and detecting long-running transactions. A DBA checklist and best practices are included to help ensure smooth performance after migration.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=1184#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.sqltabletalk.com\/?p=1184\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.sqltabletalk.com\/?p=1184#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.sqltabletalk.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Common Transaction Pitfalls After Migrating from Oracle to SQL Server\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#website\",\"url\":\"https:\/\/www.sqltabletalk.com\/\",\"name\":\"SQL Table Talk\",\"description\":\"Breaking Down SQL Server, One Post at a Time.\",\"publisher\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.sqltabletalk.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0\",\"name\":\"Stephen Planck\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/64181114edc3de3d99072c049bcec024f025c9536dc89fc8ff1bac58976ca81e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/64181114edc3de3d99072c049bcec024f025c9536dc89fc8ff1bac58976ca81e?s=96&d=mm&r=g\",\"caption\":\"Stephen Planck\"},\"logo\":{\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/dexterwiki.com\",\"https:\/\/www.linkedin.com\/in\/stephen-planck-4611b692?trk=people-guest_people_search-card&challengeId=AQErf8gbBmcVMwAAAYsyIsxO-0UvU8z7cHrBpZoo_n3xt9qEKpRN5B_jd_LmAMu-OfeArkQ7GDjobJ2uRoQQV35EQdh_rR6kxA&submissionId=09de7067-c335-8e17-40b8-8dc32b60ed6c&challengeSource=AgEcUCw35zpPmAAAAYsyI4vAWhJTV7Nt4vZYKc3V1qiDBpCkKgUvtlOBgYXcE84&challegeType=AgE_wZiTT09IAQAAAYsyI4vDmNvbZIYe6XHju5V2bXVvM3IVxnJslgY&memberId=AgESFTkUShzs_gAAAYsyI4vGYk0Gic1uc5kB6cKOABA26Gw&recognizeDevice=AgHdSZyUSI5CEwAAAYsyI4vKd_koF9JgpsCJShT8QfbK1QMiv8SI\",\"https:\/\/www.youtube.com\/linuxmate\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/8f5916388cc3b793a960dea33ff1ed86\",\"name\":\"Jon Russell\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f35049bc3903cae9c596247b2dfe95c0d9b003dd0c758b9690cc00544216aa7c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f35049bc3903cae9c596247b2dfe95c0d9b003dd0c758b9690cc00544216aa7c?s=96&d=mm&r=g\",\"caption\":\"Jon Russell\"},\"url\":\"https:\/\/www.sqltabletalk.com\/?author=49\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Common Transaction Pitfalls After Migrating from Oracle to SQL Server - SQL Table Talk","description":"This post explains common transaction pitfalls when migrating from Oracle to SQL Server. It highlights key differences in concurrency models, autocommit behavior, and isolation levels. Readers will learn why disabling autocommit or enabling implicit transactions can cause blocking and performance issues. The article provides guidance on enabling READ_COMMITTED_SNAPSHOT (RCSI), monitoring tempdb or Persistent Version Store (PVS), and detecting long-running transactions. A DBA checklist and best practices are included to help ensure smooth performance after migration.","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.sqltabletalk.com\/?p=1184","og_locale":"en_US","og_type":"article","og_title":"Common Transaction Pitfalls After Migrating from Oracle to SQL Server - SQL Table Talk","og_description":"This post explains common transaction pitfalls when migrating from Oracle to SQL Server. It highlights key differences in concurrency models, autocommit behavior, and isolation levels. Readers will learn why disabling autocommit or enabling implicit transactions can cause blocking and performance issues. The article provides guidance on enabling READ_COMMITTED_SNAPSHOT (RCSI), monitoring tempdb or Persistent Version Store (PVS), and detecting long-running transactions. A DBA checklist and best practices are included to help ensure smooth performance after migration.","og_url":"https:\/\/www.sqltabletalk.com\/?p=1184","og_site_name":"SQL Table Talk","article_published_time":"2025-09-10T14:00:00+00:00","author":"Jon Russell","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jon Russell","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sqltabletalk.com\/?p=1184#article","isPartOf":{"@id":"https:\/\/www.sqltabletalk.com\/?p=1184"},"author":{"name":"Jon Russell","@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/8f5916388cc3b793a960dea33ff1ed86"},"headline":"Common Transaction Pitfalls After Migrating from Oracle to SQL Server","datePublished":"2025-09-10T14:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sqltabletalk.com\/?p=1184"},"wordCount":987,"commentCount":0,"publisher":{"@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0"},"keywords":["Accelerated Database Recovery","implicit transactions","MVCC vs locking","Oracle to SQL Server","Persistent Version Store","READ COMMITTED SNAPSHOT","SQL Server","SQL Server Migration","SQL Server performance tuning","tempdb optimization","transaction blocking"],"articleSection":["Database Configuration","Migration","Tutorial"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.sqltabletalk.com\/?p=1184#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.sqltabletalk.com\/?p=1184","url":"https:\/\/www.sqltabletalk.com\/?p=1184","name":"Common Transaction Pitfalls After Migrating from Oracle to SQL Server - SQL Table Talk","isPartOf":{"@id":"https:\/\/www.sqltabletalk.com\/#website"},"datePublished":"2025-09-10T14:00:00+00:00","description":"This post explains common transaction pitfalls when migrating from Oracle to SQL Server. It highlights key differences in concurrency models, autocommit behavior, and isolation levels. Readers will learn why disabling autocommit or enabling implicit transactions can cause blocking and performance issues. The article provides guidance on enabling READ_COMMITTED_SNAPSHOT (RCSI), monitoring tempdb or Persistent Version Store (PVS), and detecting long-running transactions. A DBA checklist and best practices are included to help ensure smooth performance after migration.","breadcrumb":{"@id":"https:\/\/www.sqltabletalk.com\/?p=1184#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqltabletalk.com\/?p=1184"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqltabletalk.com\/?p=1184#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqltabletalk.com\/"},{"@type":"ListItem","position":2,"name":"Common Transaction Pitfalls After Migrating from Oracle to SQL Server"}]},{"@type":"WebSite","@id":"https:\/\/www.sqltabletalk.com\/#website","url":"https:\/\/www.sqltabletalk.com\/","name":"SQL Table Talk","description":"Breaking Down SQL Server, One Post at a Time.","publisher":{"@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqltabletalk.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/1947e42a9438bccd91691d8b791888e0","name":"Stephen Planck","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/64181114edc3de3d99072c049bcec024f025c9536dc89fc8ff1bac58976ca81e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/64181114edc3de3d99072c049bcec024f025c9536dc89fc8ff1bac58976ca81e?s=96&d=mm&r=g","caption":"Stephen Planck"},"logo":{"@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/dexterwiki.com","https:\/\/www.linkedin.com\/in\/stephen-planck-4611b692?trk=people-guest_people_search-card&challengeId=AQErf8gbBmcVMwAAAYsyIsxO-0UvU8z7cHrBpZoo_n3xt9qEKpRN5B_jd_LmAMu-OfeArkQ7GDjobJ2uRoQQV35EQdh_rR6kxA&submissionId=09de7067-c335-8e17-40b8-8dc32b60ed6c&challengeSource=AgEcUCw35zpPmAAAAYsyI4vAWhJTV7Nt4vZYKc3V1qiDBpCkKgUvtlOBgYXcE84&challegeType=AgE_wZiTT09IAQAAAYsyI4vDmNvbZIYe6XHju5V2bXVvM3IVxnJslgY&memberId=AgESFTkUShzs_gAAAYsyI4vGYk0Gic1uc5kB6cKOABA26Gw&recognizeDevice=AgHdSZyUSI5CEwAAAYsyI4vKd_koF9JgpsCJShT8QfbK1QMiv8SI","https:\/\/www.youtube.com\/linuxmate"]},{"@type":"Person","@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/8f5916388cc3b793a960dea33ff1ed86","name":"Jon Russell","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqltabletalk.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/f35049bc3903cae9c596247b2dfe95c0d9b003dd0c758b9690cc00544216aa7c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f35049bc3903cae9c596247b2dfe95c0d9b003dd0c758b9690cc00544216aa7c?s=96&d=mm&r=g","caption":"Jon Russell"},"url":"https:\/\/www.sqltabletalk.com\/?author=49"}]}},"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/posts\/1184","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1184"}],"version-history":[{"count":3,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/posts\/1184\/revisions"}],"predecessor-version":[{"id":1188,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=\/wp\/v2\/posts\/1184\/revisions\/1188"}],"wp:attachment":[{"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqltabletalk.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}