<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.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>RunOfTheMillBlog : .NET</title><link>http://blogs.msdn.com/ramkoth/archive/tags/.NET/default.aspx</link><description>Tags: .NET</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>SQL Server Architecture Workshop content posted</title><link>http://blogs.msdn.com/ramkoth/archive/2005/07/28/444257.aspx</link><pubDate>Thu, 28 Jul 2005 10:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:444257</guid><dc:creator>ramkoth</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/ramkoth/comments/444257.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ramkoth/commentrss.aspx?PostID=444257</wfw:commentRss><description>The content for the SQL Server Architecture Workshop (decks + samples) have been posted in a Gotdotnet workspace called .NET Architecture Workshops. Please follow the &lt;A href="http://www.gotdotnet.com/Workspaces/Workspace.aspx?id=b2fad55c-0c11-426c-86d2-4e7f62d9ef0b"&gt;&lt;FONT color=#0000cc&gt;link &lt;/FONT&gt;&lt;/A&gt;to register yourself with the workspace to download the content. 
&lt;P&gt;I will post the CLR Architecture workshop content soon.&lt;/P&gt;
&lt;P&gt;I am also looking forward to hear from you regarding the future workshops and the subject areas of interest to solution architects. Please use the 'Contact Form' to directly send an email to me. Thanks.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=444257" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ramkoth/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/ramkoth/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://blogs.msdn.com/ramkoth/archive/tags/India/default.aspx">India</category></item><item><title>Manually creating DTC Transactions</title><link>http://blogs.msdn.com/ramkoth/archive/2003/12/23/45176.aspx</link><pubDate>Tue, 23 Dec 2003 14:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45176</guid><dc:creator>ramkoth</dc:creator><slash:comments>7</slash:comments><comments>http://blogs.msdn.com/ramkoth/comments/45176.aspx</comments><wfw:commentRss>http://blogs.msdn.com/ramkoth/commentrss.aspx?PostID=45176</wfw:commentRss><description>&lt;P&gt;I have seen this article somewhere before. I am not able to find it. I modified the code little bit and reposting it here.&lt;/P&gt;
&lt;P&gt;Scenario: There are cases where your application has to update your database and queue messages to MSMQ in a single atomic transaction scope. In .NETV1.0, the only way to achieve this is to use COM+ through System.EnterpriseServices. In .NET V1.1 there is another way to do this without using System.EnterpriseServices. &lt;/P&gt;
&lt;P&gt;The idea here is to create a DTC transaction through TransactionDispenser component provided by DTC. Once you get the transaction object, you can pass the transaction object to your SQL provider as well as MSMQ APIs to participate in a single transaction. DTC takes care of two phase commit. &lt;/P&gt;
&lt;P&gt;Sample code here explains how to obtain a transaction from DTC. Once you get the ITransaction interface, you can pass it on to any resource managers that support ITransaction. You have to use Interop to get the DTC Transaction.&lt;/P&gt;
&lt;P&gt;using System.Runtime.InteropServices;&lt;BR&gt;using System.Runtime.CompilerServices;&lt;BR&gt;using System.EnterpriseServices;&lt;/P&gt;
&lt;P&gt;namespace Transactions&lt;BR&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;[Flags]&lt;BR&gt;&amp;nbsp;public enum ISOLATIONLEVEL&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;//ISOLATIONLEVEL_UNSPECIFIED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0xFFFFFFFF,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOLATIONLEVEL_CHAOS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000010,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOLATIONLEVEL_READUNCOMMITTED&amp;nbsp; = 0x00000100,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOLATIONLEVEL_BROWSE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00000100,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOLATIONLEVEL_READCOMMITTED&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00001000,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOLATIONLEVEL_CURSORSTABILITY&amp;nbsp; = 0x00001000,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOLATIONLEVEL_REPEATABLEREAD&amp;nbsp;&amp;nbsp; = 0x00010000,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOLATIONLEVEL_SERIALIZABLE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00100000,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOLATIONLEVEL_ISOLATED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 0x00100000&lt;BR&gt;&amp;nbsp;} &lt;/P&gt;
&lt;P&gt;&amp;nbsp;public enum ISOFLAG &lt;BR&gt;&amp;nbsp;{ &lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_RETAIN_COMMIT_DC&amp;nbsp; =&amp;nbsp; 1,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_RETAIN_COMMIT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp; 2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_RETAIN_COMMIT_NO&amp;nbsp; =&amp;nbsp; 3,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_RETAIN_ABORT_DC&amp;nbsp;&amp;nbsp; =&amp;nbsp; 4,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_RETAIN_ABORT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp; 8,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_RETAIN_ABORT_NO&amp;nbsp;&amp;nbsp; = 12,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_RETAIN_DONTCARE&amp;nbsp;&amp;nbsp; =&amp;nbsp; 7,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_RETAIN_BOTH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 10,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_RETAIN_NONE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 13,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_OPTIMISTIC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 16,&lt;BR&gt;&amp;nbsp;&amp;nbsp;ISOFLAG_READONLY&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = 32&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;//0x3A6AD9E1, 0x23B9, 0x11cf, 0xAD, 0x60, 0x00, 0xAA, 0x00, 0xA7, 0x4C, 0xCD);&lt;BR&gt;&amp;nbsp;[Guid("3A6AD9E1-23B9-11cf-AD60-00AA00A74CCD")]&lt;BR&gt;&amp;nbsp;[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]&lt;BR&gt;&amp;nbsp;public interface ITransactionDispenser&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;ushort&amp;nbsp;GetOptionsObject([MarshalAs(UnmanagedType.IUnknown)]ref object options);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;int&amp;nbsp;BeginTransaction(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[MarshalAs(UnmanagedType.IUnknown)] object pUnknownOuter,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ISOLATIONLEVEL isoLevel,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ISOFLAG isoFlag,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[MarshalAs(UnmanagedType.IUnknown)] object transactionOptions,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[MarshalAs(UnmanagedType.Interface)] ref ITransaction pTransaction);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;public class NativeSafeDTC&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;public static Guid DispenserIID = new Guid("3A6AD9E1-23B9-11cf-AD60-00AA00A74CCD");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;[DllImport("xolehlp.dll")]&lt;BR&gt;&amp;nbsp;&amp;nbsp;public static extern int DtcGetTransactionManager(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr hostName,//[MarshalAsAttribute(UnmanagedType.LPStr)]string hostName,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr tmName,//[MarshalAsAttribute(UnmanagedType.LPSTR)]string tmName,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ref Guid iid,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt32 dwReserved1,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UInt16 wReserved2,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr pvReserved,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[MarshalAsAttribute(UnmanagedType.Interface)]ref ITransactionDispenser txnDispenser);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Client Code&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;class Class1&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// The main entry point for the application.&lt;BR&gt;&amp;nbsp;&amp;nbsp;/// &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;[STAThread]&lt;BR&gt;&amp;nbsp;&amp;nbsp;static void Main(string[] args)&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// TODO: Add code to start application here&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ITransactionDispenser oDispenser = null;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int hResult = NativeSafeDTC.DtcGetTransactionManager(IntPtr.Zero,//null, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr.Zero,//null, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ref NativeSafeDTC.DispenserIID,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0, 0, IntPtr.Zero, &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ref oDispenser);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (oDispenser != null)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ITransactionDispenser dispenser = oDispenser;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine("Got a good dispenser");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i=0; i &amp;lt; 100000; i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ITransaction transaction = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dispenser.BeginTransaction(null, ISOLATIONLEVEL.ISOLATIONLEVEL_SERIALIZABLE,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ISOFLAG.ISOFLAG_RETAIN_DONTCARE, null, ref transaction);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (transaction != null)&lt;BR&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;//Console.WriteLine("Obtained good transaction object");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction.Commit(0,0,0);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=45176" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/ramkoth/archive/tags/.NET/default.aspx">.NET</category></item></channel></rss>