<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlblog.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'Defensive programming' and 'Stress Testing'</title><link>http://sqlblog.com/search/SearchResults.aspx?o=DateDescending&amp;tag=Defensive+programming,Stress+Testing&amp;orTags=0</link><description>Search results matching tags 'Defensive programming' and 'Stress Testing'</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>T-SQL Tuesday #002: patterns that do not work as expected.</title><link>http://sqlblog.com/blogs/alexander_kuznetsov/archive/2010/01/12/t-sql-tuesday-002-patterns-that-do-not-work-as-expected.aspx</link><pubDate>Tue, 12 Jan 2010 14:38:00 GMT</pubDate><guid isPermaLink="false">21093a07-8b3d-42db-8cbf-3350fcbf5496:20931</guid><dc:creator>Alexander Kuznetsov</dc:creator><description>&lt;p&gt;Neither &lt;/p&gt;
&lt;p&gt;UPDATE … IF (@@ROWCOUNT = 0) INSERT&lt;/p&gt;
&lt;p&gt;nor&lt;/p&gt;
&lt;p&gt;IF EXISTS(...) UPDATE ELSE INSERT&lt;/p&gt;
&lt;p&gt;patterns work as expected under high concurrency. Both may fail. Both may fail very frequently. MERGE is the king - it holds up much better.Let us do some stress testing and see for ourselves.&lt;/p&gt;&lt;p&gt;Here is the table we shall be using:&lt;/p&gt;&lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:blue;"&gt;CREATE&amp;nbsp;TABLE&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;NOT&amp;nbsp;NULL&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;PRIMARY&amp;nbsp;KEY&lt;/span&gt;&lt;span style="color:gray;"&gt;,
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i1&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;NOT&amp;nbsp;NULL&amp;nbsp;,
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i2&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;NOT&amp;nbsp;NULL&amp;nbsp;,
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;version&amp;nbsp;ROWVERSION
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&amp;nbsp;;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:black;"&gt;GO
&lt;br&gt;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;INSERT&amp;nbsp;&amp;nbsp;INTO&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i1&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i2&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;VALUES&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;1&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&amp;nbsp;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/code&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;IF EXISTS(…) THEN pattern frequently fails under high concurrency.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;font face="Garamond" size="3"&gt;Let us insert or update 
rows in a loop using the following simple logic: if a row with given 
ID exists, update it, and otherwise insert a new one. The following 
loop implements this logic. Cut and paste it into two tabs, switch into 
text mode in both tabs, and run them simultaneously.&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:green;"&gt;--&amp;nbsp;hit&amp;nbsp;Ctrl+T&amp;nbsp;to&amp;nbsp;execute&amp;nbsp;in&amp;nbsp;text&amp;nbsp;mode
&lt;br&gt;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;NOCOUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;ON&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;WHILE&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;gt;&amp;nbsp;-&lt;/span&gt;&lt;span style="color:black;"&gt;100000
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp;&amp;nbsp;MIN&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;1&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;TRY&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;TRANSACTION&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;IF&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;EXISTS&amp;nbsp;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;*
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;UPDATE&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i1&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;1
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;ELSE
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INSERT&amp;nbsp;&amp;nbsp;INTO&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i1&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i2&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;VALUES&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&amp;nbsp;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;COMMIT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;TRY
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;CATCH&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;ROLLBACK&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;error_message&lt;/span&gt;&lt;span style="color:gray;"&gt;()&amp;nbsp;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;CATCH&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;&amp;nbsp;
&lt;/span&gt;&lt;/code&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Garamond" size="3"&gt;When we run this script 
simultaneously in two tabs, we shall immediately get a huge amount of 
primary key violations in both tabs. This demonstrates how unreliable 
the &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;b&gt;IF EXISTS&lt;/b&gt;&lt;/font&gt;&lt;font face="Garamond" size="3"&gt; pattern is when it executes under high concurrency.&lt;/font&gt;
&lt;/p&gt;
&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;/font&gt;&lt;/font&gt;
&lt;p align="justify"&gt;&lt;font face="Garamond" size="3"&gt;&lt;b&gt;Note:&lt;/b&gt; this 
example also demonstrates that it is not safe to use &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;b&gt;SELECT 
MAX(ID)+1&lt;/b&gt;&lt;/font&gt;&lt;font face="Garamond" size="3"&gt; or &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;b&gt;SELECT 
MIN(ID)-1&lt;/b&gt;&lt;/font&gt;&lt;font face="Garamond" size="3"&gt;&amp;nbsp; as the next 
available unique value if we do it under concurrency.&lt;/font&gt;&lt;/p&gt;&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;UPDATE … IF (@@ROWCOUNT = 0) BEGIN pattern is also unreliable.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;font face="Garamond" size="3"&gt;Another common approach 
is to update a row first, and if no row was updated, insert it. It is 
also unreliable. Before demonstrating that, let us delete the rows inserted 
by the previous example:&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" face="Courier New" size="2"&gt;DELETE&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;font color="#0000ff" face="Courier New" size="2"&gt;FROM&lt;/font&gt;&lt;font face="Courier New" size="2"&gt; dbo&lt;/font&gt;&lt;font color="#808080" face="Courier New" size="2"&gt;.&lt;/font&gt;&lt;font color="#0000ff" face="Courier New" size="2"&gt;TwoINTs WHERE&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp;&amp;nbsp; ID &lt;/font&gt;&lt;font color="#808080" face="Courier New" size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt; 1 &lt;/font&gt;&lt;font color="#808080" face="Courier New" size="2"&gt;;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Garamond" size="3"&gt;Let us modify the 
loop which we ran in the previous example, as follows:&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:green;"&gt;--&amp;nbsp;hit&amp;nbsp;Ctrl+T&amp;nbsp;to&amp;nbsp;execute&amp;nbsp;in&amp;nbsp;text&amp;nbsp;mode
&lt;br&gt;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;NOCOUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;ON&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;WHILE&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;gt;&amp;nbsp;-&lt;/span&gt;&lt;span style="color:black;"&gt;100000
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp;&amp;nbsp;MIN&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;1&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&lt;/span&gt;&lt;/code&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;TRY&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;TRANSACTION&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;UPDATE&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i1&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;1
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;WHERE&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;IF&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;@@ROWCOUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INSERT&amp;nbsp;&amp;nbsp;INTO&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i1&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i2&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;VALUES&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&amp;nbsp;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;COMMIT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;TRY
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;CATCH&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;error_message&lt;/span&gt;&lt;span style="color:gray;"&gt;()&amp;nbsp;;&amp;nbsp;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;ROLLBACK&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;CATCH&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:gray;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:gray;"&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;&lt;/span&gt;&lt;/code&gt;                &amp;nbsp;&amp;nbsp;
              &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;font face="Garamond" size="3"&gt;When we run this script simultaneously from two tabs, we are getting lots of primary key 
violations, just like when we ran our previous example.&lt;/font&gt;&lt;/p&gt;

&lt;p align="justify"&gt;&lt;font face="Garamond" size="3"&gt;As we have seen, the &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;b&gt;UPDATE 
… IF (@@ROWCOUNT = 0) &lt;/b&gt;&lt;/font&gt;&lt;font face="Garamond" size="3"&gt;pattern&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;b&gt; &lt;/b&gt;&lt;/font&gt;&lt;font face="Garamond" size="3"&gt;is 
unreliable under high concurrency too.&lt;/font&gt;&lt;/p&gt;&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;MERGE holds up perfectly well&lt;br&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Again, &lt;font face="Garamond" size="3"&gt;let us delete the rows inserted 
by the previous example:&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff" face="Courier New" size="2"&gt;DELETE&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp; &lt;/font&gt;&lt;font color="#0000ff" face="Courier New" size="2"&gt;FROM&lt;/font&gt;&lt;font face="Courier New" size="2"&gt; dbo&lt;/font&gt;&lt;font color="#808080" face="Courier New" size="2"&gt;.&lt;/font&gt;&lt;font color="#0000ff" face="Courier New" size="2"&gt;TwoINTs WHERE&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&amp;nbsp;&amp;nbsp; ID &lt;/font&gt;&lt;font color="#808080" face="Courier New" size="2"&gt;&amp;lt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt; 1 &lt;/font&gt;&lt;font color="#808080" face="Courier New" size="2"&gt;;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;Rerun the loop using MERGE:&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;code style="font-size:12px;"&gt;&lt;span style="color:green;"&gt;--&amp;nbsp;hit&amp;nbsp;Ctrl+T&amp;nbsp;to&amp;nbsp;execute&amp;nbsp;in&amp;nbsp;text&amp;nbsp;mode
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;NOCOUNT&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;ON&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;DECLARE&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;INT&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;WHILE&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;gt;&amp;nbsp;-&lt;/span&gt;&lt;span style="color:black;"&gt;100000
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp;&amp;nbsp;MIN&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;dbo.TwoINTs
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&amp;nbsp;-&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;1&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;TRY&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;MERGE&amp;nbsp;dbo.TwoINTs&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;target
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;USING
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;AS&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;source&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i1&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i2&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;ON&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;target.ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;source.ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;WHEN&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;MATCHED
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;THEN
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UPDATE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SET
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i1&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;1
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;WHEN&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;NOT&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;MATCHED
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;THEN&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;INSERT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;ID&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i1&lt;/span&gt;&lt;span style="color:gray;"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;i2&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;VALUES
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span&gt;@ID&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;,
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;0
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;)&amp;nbsp;;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;TRY
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;CATCH&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;SELECT&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;error_message&lt;/span&gt;&lt;span style="color:gray;"&gt;()&amp;nbsp;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:black;"&gt;CATCH&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;
&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color:blue;"&gt;END&amp;nbsp;&lt;/span&gt;&lt;span style="color:gray;"&gt;;&lt;/span&gt;&lt;/code&gt;                &amp;nbsp;&amp;nbsp;
              &lt;/p&gt;
&lt;p&gt;&lt;font face="Garamond" size="3"&gt;In the 
context of our loop, &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;b&gt;MERGE&lt;/b&gt;&lt;/font&gt;&lt;font face="Garamond" size="3"&gt; always completes without a single error!&lt;/font&gt;&lt;/p&gt;
&lt;p align="justify"&gt;&lt;font face="Garamond" size="3"&gt;As we have seen, in 
this particular case &lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;b&gt;MERGE&lt;/b&gt;&lt;/font&gt;&lt;font face="Garamond" size="3"&gt; holds up under high concurrency perfectly 
well. Of course, this does not mean that we can always use this new 
command without stress testing. Yet we should at least consider using 
it whenever we insert or update under high concurrency, with usual precautions 
and after thorough testing. &lt;/font&gt;&lt;/p&gt;&lt;p align="justify"&gt;It is fun to be blogging again. I kind of neglected blogging for some time, because I am writing a book on defensive programming, and that requires a huge amount of time. Anyway, it feels good to be back. The book should be finished soon, and I'll start contributing here more.&lt;br&gt;&lt;/p&gt;&lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://sqlblog.com/blogs/adam_machanic/archive/2010/01/04/invitation-for-t-sql-tuesday-002-a-puzzling-situation.aspx"&gt;This post participates in the second SQL Tuesday&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>