PDA

View Full Version : Distributed Transaction Coordinator or DTC



omid_Ahmadi
پنج شنبه 11 فروردین 1384, 10:41 صبح
سلام
من در یک Web Application یک قسمت Submit دارم که اطلاعات کاربران را در دریافت میکند و در چند جدول ذخیره میکند. برای اینکه اطلاعات رو بدون نقص دریافت کنم باید از یک Transaction استفاده کنم ولی چون این کار رو طی چند فرم انجام میدم استفاده از DataSet Transaction یا DataBase Connection Transaction کارایی خوبی رو ارایه نمیده و بهترین راه استفاده از Enterprise Transaction به وسیله DTC است. میخواستم بدونم کسی راجع به استفاده از Enterprise Transaction یا حتی خود DTC در SQL Server اطلاعاتی داره؟

با تشکر

Behrouz_Rad
پنج شنبه 11 فروردین 1384, 14:40 عصر
البته از DTC بیشتر برای ارتباط جداول در دو بانک مختلف یا حتی Data Source های متفاوت استفاده میشه.
به هر حال...
با استفاده از یک Stored Procedure و کدی شبیه به کد زیر:


BEGIN TRANSACTION
USE MyDatabase
GO
INSERT INTO MyTable(MyField1,MyField2)
VALUES(MyValue1,MyValue2)
GO
UPDATE MyTable
SET MyField1 = MyValue * 10
WHERE MyField2 > 8000
GO
COMMIT
GO

Behrouz_Rad
جمعه 12 فروردین 1384, 20:38 عصر
روش که گفتم برای تراکنش یک مرحله ای بود.
در NET Framework 1.1.، احتمالا باید به همون تراکنش مربوط به Provider Connection کار کنید (تا حالا برخورد نکردم) اما در ASP 2.0، با استفاده از کلاس System.Transaction، به راحتی می تونید از تراکنش های چند مرحله ای استفاده کنید.
مثلا در کد زیر:


public void A(){

using (TransactionScope transactionscope1 = new TransactionScope()){

this.B( );

transactionscope1.Complete()

}

}

public void B(){

using (TransactionScope transactionscope1 = new TransactionScope(TransactionScopeOption.Suppress)) {

using (SqlConnection sqlconnection1 = new SqlConnection(connectionstring)){

sqlconnection1.Open();

SqlCommand sqlcommand1 = sqlconnection1.CreateCommand();

sqlcommand1.CommandText = "raiserror ('my error', 20, 20) with log";

try {

sqlcommand1.ExecuteNonQuery();

}

catch(Exception e){

Console.WriteLine(e.Message);

}

}

transactionscope1.Complete();

}

}

}

به راحتی می تونیم تراکنش ها رو در چندین مرحله پیاده سازی کنیم.

omid_Ahmadi
شنبه 13 فروردین 1384, 08:34 صبح
سلام
من این مورد رو که باید برای استفاده از یک Transaction در چند فرم از Enterprise Transactions With DTC استفاده کرد رو از کتاب WebApplications with C# مایکروسافت پیدا کردم. توی اوون کتاب برای این کار گفته شده بود که باید به قسمت Page Directive صفحه ویژگی Transaction="TransactionName" رو اضافه کنیم و سپس با استفاده از متدهای SetAbort و SetComplete کلاس ContextUtil و یا CommitTransaction و AbortTransaction کلاس Page استفاده کنیم. ولی چون اطلاعات داخل کتاب خیلی خلاصه و مختصر بود میخواستم بدوونم کسی از این ویژگی استفاده کرده و طرز کار کامل اوون رو میدونه؟

متن خود کتاب به این صورته:


Because transaction can span multiple webforms or even multiple components within a distributed application ASP.NET provides a way for web forms to work with DTC.
To use DTC from a web form follow these steps:
1)Start a new transaction or continue an existing transaction by setting the document element's transaction attribute. For example the following @Page directive strats a new transaction:
<%@Page Language="C#" AutoEventWireup="false" CodeBehined="PageTransaction.aspx.cs" Inherits="csTransactionSnippet.PageTransaction" Transaction="RequiresNow"%>
2) Add a reference to the System.EnterpriseServices namespace to your project
3)Use the ContextUtil class's SetAbort and SetComplete metoids to change the status of the transaction as required
4)Use the Page class's CommitTransaction and AbortTransaction events to respond to changes in the transaction's status

Behrouz_Rad
شنبه 13 فروردین 1384, 10:12 صبح
بله روشی که میگید در .NET Framework 1.1.. وجود داره و در ASP 2.0 با وجود کلاس System.Transaction کار راحت شده.
در لینک زیر به صورت جامع و کامل همراه با ذکر مثال در مورد تراکنش های چند مرحله ای در 3 صفحه به خوبی توضیح داده شده.
http://www.codeguru.com/Csharp/Csharp/cs_network/internetweb/article.php/c7789/
موفق باشیدو
:wise1:

omid_Ahmadi
شنبه 13 فروردین 1384, 12:48 عصر
سلام
راجع به این کلاس در ASP.NET 2 من هم چیزهایی خوندم ولی متاسفانه برنامه من با ASP.NET 1 نوشته شده و من هم روشی رو که گفتم نه تا حالا باهاش کار کردم نه مثالی راجع به اوون دیدم. میخواستم بدونم کسی اطلاعات بیشتری در این مورد یا یک مثال که این مورد در اون استفاده شده باشه نداره؟

Behrouz_Rad
شنبه 13 فروردین 1384, 12:57 عصر
آقای احمدی مگه لینکی رو که دادم ندیدید؟
همون چیزیه که شما می خواید. :wise1:

omid_Ahmadi
شنبه 13 فروردین 1384, 13:03 عصر
خیلی سریع جواب دادید :wink:
خیلی ممنون درسته