{"id":1953,"date":"2013-10-01T13:00:00","date_gmt":"2013-10-01T20:00:00","guid":{"rendered":"https:\/\/blogs.technet.microsoft.com\/dataplatforminsider\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/"},"modified":"2024-01-22T22:49:09","modified_gmt":"2024-01-23T06:49:09","slug":"in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables","status":"publish","type":"post","link":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/","title":{"rendered":"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables"},"content":{"rendered":"<p>The new In-Memory OLTP feature introduces memory-optimized tables and natively compiled stored procedures in SQL Server 2014, to optimize performance and scalability of OLTP workloads. To benefit from this technology in an existing SQL Server application, you need to migrate the performance critical tables and stored procedures to memory-optimized tables and natively compiled stored procedures respectively. End-to-end migration of tables and procedures was discussed in the blog post <a href=\"http:\/\/blogs.technet.com\/b\/dataplatforminsider\/archive\/2013\/08\/13\/sql-server-2014-in-memory-oltp-app-migration-scenario-leveraging-the-integrated-approach.aspx\">here<\/a>. In this post we focus on the implications of the new transaction isolation model to application migration.<\/p>\n<p>Transaction isolation levels for memory-optimized tables are implemented using optimistic concurrency control and therefore are lock-free. This means that SQL Server does not use locks to guarantee consistency in case multiple transactions attempt to access the same data. Instead, SQL uses a combination of snapshot-based isolation and conflict detection to guarantee consistency. For more details on transactions with In-Memory OLTP see the Books Online topic <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dn133169(v=sql.120).aspx\">here<\/a>. We will discuss the principles and the architecture of the lock-free engine for memory-optimized tables in more detail in a later post.<\/p>\n<p><b>Snapshot-based isolation<\/b><\/p>\n<p>All transactions read rows from memory-optimized tables as of a single point in time, usually the start of the transaction. This means that a running transaction does not observe changes made by other, concurrent, transactions that commit while the transaction is running.<\/p>\n<p>Consider, for example, two transaction, <i>tx1<\/i> and <i>tx2<\/i>, and a single memory-optimized table <i>Tab<\/i>, with a single row <i>r1<\/i>. The following table shows an example in which the transaction <i>tx1<\/i> reads from the table, and <i>tx2 <\/i>inserts a row. The first column indicates the time; the second column indicates the contents of the table <i>Tab<\/i>.<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"78\">  <b>Time<\/b>  <\/td>\n<td valign=\"top\" width=\"126\">\n<p><b>Contents of <i>Tab<\/i><\/b><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p><b>Operations in <i>tx1<\/i><\/b><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p><b>Operations in <i>tx2<\/i><\/b><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>100<\/p>\n<\/td>\n<td valign=\"top\" width=\"126\">\n<p><i>r1<\/i><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>BEGIN TRAN<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>101<\/p>\n<\/td>\n<td valign=\"top\" width=\"126\">\n<p><i>r1<\/i><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>\u2026<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>BEGIN TRAN<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>102<\/p>\n<\/td>\n<td valign=\"top\" width=\"126\">\n<p><i>r1<\/i><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>SELECT FROM Tab<\/p>\n<p>* returns (<i>r1<\/i>)<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>INSERT Tab VALUES (<i>r2<\/i>)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>103<\/p>\n<\/td>\n<td valign=\"top\" width=\"126\">\n<p><i>r1, r2<\/i><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>\u2026<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>COMMIT<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>104<\/p>\n<\/td>\n<td valign=\"top\" width=\"126\">\n<p><i>r1, r2<\/i><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>\u2026<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>105<\/p>\n<\/td>\n<td valign=\"top\" width=\"126\">\n<p><i>r1, r2<\/i><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>SELECT FROM Tab<\/p>\n<p>* <b>returns (<i>r1<\/i>)<\/b><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>106<\/p>\n<\/td>\n<td valign=\"top\" width=\"126\">\n<p><i>r1, r2<\/i><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>COMMIT<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\u00a0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Notice that at time 105, even though the table <i>Tab<\/i> contains two rows (<i>r1<\/i>, <i>r2<\/i>), the transaction <i>tx1<\/i> only sees <i>r1<\/i>. All read operations in <i>tx1<\/i> are executed as of time 100.<\/p>\n<p>Snapshots in transaction isolation are not new in SQL Server. SNAPSHOT isolation has been available for disk-based tables since SQL Server 2005. However, the default isolation level for disk-based table remains read committed, and higher isolation levels such as REPEATABLE READ and SERIALIZABLE do not use snapshots. Memory-optimized tables use snapshots for all transaction isolation levels, including SNAPSHOT, REPEATABLE READ, and SERIALIZABLE.<\/p>\n<p>You need to keep this in mind when migrating a table to memory-optimized, in particular when using READ COMMITTED isolation today. If there are no dependencies between concurrent transactions at the application level, in most cases you can use SNAPSHOT isolation on the migrated tables without changing the application. However, if there is a dependency, and the application relies on <i>tx1<\/i> seeing the changes made by <i>tx2<\/i>, you need to make further changes to the app to handle snapshot-based isolation. For example, you could commit <i>tx1<\/i> after the initial read operation at time 102, and start a new transaction, which would be able to see rows inserted by <i>tx2<\/i>.<\/p>\n<p>For guidelines on transaction isolation levels with memory-optimized tables, and how to migrate apps that use the READ COMMITTED isolation level today, see <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dn133187(v=sql.120).aspx\">Books Online<\/a>.<\/p>\n<p><b>Conflicts<\/b><\/p>\n<p>Rather than taking locks to prevent concurrent access to a table, memory-optimized tables use conflict detection to enforce isolation of modifications, and to guarantee the higher isolation levels REPEATABLE READ and SERIALIZABLE.<\/p>\n<p>If two concurrent transactions attempt to update the same row, one of the transactions will fail and roll back. Consider the following example, where two transaction attempt to update the same row <i>r1<\/i>.<\/p>\n<table cellspacing=\"0\" cellpadding=\"0\" border=\"1\">\n<tbody>\n<tr>\n<td valign=\"top\" width=\"78\">  <b>Time<\/b>  <\/td>\n<td valign=\"top\" width=\"210\">\n<p><b>Operations in <i>tx1<\/i><\/b><\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p><b>Operations in <i>tx2<\/i><\/b><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>100<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>BEGIN TRAN<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\u00a0<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>101<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>\u2026<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>BEGIN TRAN<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>102<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>\u2026<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>UPDATE <i>r1 <\/i>\u2013 success<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>103<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>UPDATE <i>r1<\/i> \u2013 error \u2013 <i>tx1<\/i> is aborted<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\n<p>\u2026<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td valign=\"top\" width=\"78\">\n<p>104<\/p>\n<\/td>\n<td valign=\"top\" width=\"210\">\u00a0<\/td>\n<td valign=\"top\" width=\"210\">\n<p>COMMIT \u2013 success<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>In this example, <i>tx2<\/i> successfully updates <i>r1 <\/i>and later successfully commits. Transaction tx1 attempts to update <i>r1<\/i> after it has already been updated by <i>tx2<\/i>. The update fails, and transaction <i>tx1<\/i> is aborted. The first writer, in this case <i>tx2<\/i>, always wins. Transaction <i>tx1<\/i> will need to be retried. In contrast, with READ COMMITTED isolation in disk-based tables, <i>tx2<\/i> would take a lock when it updates <i>r1<\/i>. Transaction <i>tx1<\/i> would block and wait until <i>tx2<\/i> commits and the lock is released. At that point, i.e. after time 104, <i>tx1<\/i> would proceed with the update to <i>r1<\/i>.<\/p>\n<p>Validation of REPEATABLE READ and SERIALIZABLE isolation is done during commit processing. If SQL Server finds that the desired isolation level has been violated, the transaction is aborted at this time.<\/p>\n<p>As conflicts cause transaction abort, transactions may need to be retried. For this reason, transactions that modify memory-optimized tables require logic to retry the transactions on failures. This retry logic can be implemented either in the client application, or through a wrapper stored procedure on the server. For more details on retry logic and a sample stored procedure implementing retry logic, see <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/dn169141(v=sql.120).aspx\">Books Online<\/a>.<\/p>\n<p><a href=\"http:\/\/technet.microsoft.com\/en-US\/evalcenter\/dn205290?WT.mc_id=Blog_SQL_InMem_SQL2014\">Download SQL Server CTP1<\/a>and get started today, or see more blogs in the <a href=\"http:\/\/blogs.technet.com\/b\/dataplatforminsider\/archive\/2013\/06\/26\/sql-server-2014-in-memory-technologies-blog-series-introduction.aspx\">series introduction and index here<\/a>!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The new In-Memory OLTP feature introduces memory-optimized tables and natively compiled stored procedures in SQL Server 2014, to optimize performance and scalability of OLTP workloads.<\/p>\n","protected":false},"author":1457,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","footnotes":""},"post_tag":[],"product":[],"content-type":[2424],"topic":[],"coauthors":[2487],"class_list":["post-1953","post","type-post","status-publish","format-standard","hentry","content-type-best-practices"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables - Microsoft SQL Server 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.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables - Microsoft SQL Server Blog\" \/>\n<meta property=\"og:description\" content=\"The new In-Memory OLTP feature introduces memory-optimized tables and natively compiled stored procedures in SQL Server 2014, to optimize performance and scalability of OLTP workloads.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft SQL Server Blog\" \/>\n<meta property=\"article:publisher\" content=\"http:\/\/www.facebook.com\/sqlserver\" \/>\n<meta property=\"article:published_time\" content=\"2013-10-01T20:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-23T06:49:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/08\/cropped-microsoft_logo_element.png\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"SQL Server Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SQLServer\" \/>\n<meta name=\"twitter:site\" content=\"@SQLServer\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"SQL Server Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 min read\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/\"},\"author\":[{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/author\/sql-server-team\/\",\"@type\":\"Person\",\"@name\":\"SQL Server Team\"}],\"headline\":\"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables\",\"datePublished\":\"2013-10-01T20:00:00+00:00\",\"dateModified\":\"2024-01-23T06:49:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/\"},\"wordCount\":845,\"commentCount\":12,\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/\",\"name\":\"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables - Microsoft SQL Server Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website\"},\"datePublished\":\"2013-10-01T20:00:00+00:00\",\"dateModified\":\"2024-01-23T06:49:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/\",\"name\":\"Microsoft SQL Server Blog\",\"description\":\"Official News from Microsoft\u2019s Information Platform\",\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization\",\"name\":\"Microsoft SQL Server Blog\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"contentUrl\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png\",\"width\":259,\"height\":194,\"caption\":\"Microsoft SQL Server Blog\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"http:\/\/www.facebook.com\/sqlserver\",\"https:\/\/x.com\/SQLServer\",\"https:\/\/www.youtube.com\/user\/MSCloudOS\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables - Microsoft SQL Server 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.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/","og_locale":"en_US","og_type":"article","og_title":"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables - Microsoft SQL Server Blog","og_description":"The new In-Memory OLTP feature introduces memory-optimized tables and natively compiled stored procedures in SQL Server 2014, to optimize performance and scalability of OLTP workloads.","og_url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/","og_site_name":"Microsoft SQL Server Blog","article_publisher":"http:\/\/www.facebook.com\/sqlserver","article_published_time":"2013-10-01T20:00:00+00:00","article_modified_time":"2024-01-23T06:49:09+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2018\/08\/cropped-microsoft_logo_element.png","type":"image\/png"}],"author":"SQL Server Team","twitter_card":"summary_large_image","twitter_creator":"@SQLServer","twitter_site":"@SQLServer","twitter_misc":{"Written by":"SQL Server Team","Est. reading time":"3 min read"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/#article","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/"},"author":[{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/author\/sql-server-team\/","@type":"Person","@name":"SQL Server Team"}],"headline":"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables","datePublished":"2013-10-01T20:00:00+00:00","dateModified":"2024-01-23T06:49:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/"},"wordCount":845,"commentCount":12,"publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization"},"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/","name":"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables - Microsoft SQL Server Blog","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website"},"datePublished":"2013-10-01T20:00:00+00:00","dateModified":"2024-01-23T06:49:09+00:00","breadcrumb":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/2013\/10\/01\/in-memory-oltp-programmability-concurrency-and-transaction-isolation-for-memory-optimized-tables\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/"},{"@type":"ListItem","position":2,"name":"In-Memory OLTP Programmability: Concurrency and Transaction Isolation for Memory-optimized Tables"}]},{"@type":"WebSite","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#website","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/","name":"Microsoft SQL Server Blog","description":"Official News from Microsoft\u2019s Information Platform","publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#organization","name":"Microsoft SQL Server Blog","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","contentUrl":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-content\/uploads\/2019\/08\/Microsoft-Logo.png","width":259,"height":194,"caption":"Microsoft SQL Server Blog"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/#\/schema\/logo\/image\/"},"sameAs":["http:\/\/www.facebook.com\/sqlserver","https:\/\/x.com\/SQLServer","https:\/\/www.youtube.com\/user\/MSCloudOS"]}]}},"msxcm_display_generated_audio":false,"msxcm_animated_featured_image":null,"_links":{"self":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts\/1953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/users\/1457"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/comments?post=1953"}],"version-history":[{"count":0,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/posts\/1953\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/media?parent=1953"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/post_tag?post=1953"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/product?post=1953"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/content-type?post=1953"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/topic?post=1953"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/sql-server\/blog\/wp-json\/wp\/v2\/coauthors?post=1953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}