更新:GetDataとUpdateの両方を、TransactionScope内の同じデータアダプタでのみ回避策と共に使用するときに、トランザクションがLTMからMSDTCに昇格される理由を説明する記事が見つかりました。
決定的TableAdapters +トランザクションのブログ記事 http://blah.winsmarts.com/2006/06/18/the-definitive-tableadapters--transactions-blog-post.aspx
私はかつて、分散されるトランザクションをエスカレートで開いた複数の接続を持っていることについての部分を理解しています。ただし、接続が1つしかなく、エスカレートしているデータベースに対して1つのクエリが発生するという問題があります。ストアドプロシージャにもトランザクションはありません。誰かが手がかりを持っているなら、私はそれを聞きたい。私のコード例から、 "adapter.Update(table)"は分散トランザクションをトリガーします。
私は既存のプロジェクトからコードを取り除き、何が起こっているのかを単純化しました。私はまだ同じ問題を抱えています。これは、基本的にテーブルアダプタを使用してデータセットを作成し、それをストアドプロシージャで設定して選択、挿入、および削除することです。私は、特定のユーザーと関連するすべてのレコードを選択します。次に、レコードのいずれかに「myPPID」が存在するかどうかによって、レコードを追加または削除します。次に、更新メソッドを呼び出して、コンポーネントサービスのトランザクション統計を見て、トランザクションのエスカレートが配信されることを確認します。
私はWindows XP Pro SP3と.NET Framework 3.5をクライアントプログラムに使用しています。 LANを介してWindows Server 2003 R2 Enterprise Edition SP2に接続するSQL 2005データベースに接続します。
private void button1_Click(object sender, EventArgs e)
{
int userId = 3;
int myPPId = 881;
using (TransactionScope ts = new TransactionScope())
{
using (DataSet1TableAdapters.AssignedPPTableAdapter adapter
= new MSDTCPromotionTest.DataSet1TableAdapters.AssignedPPTableAdapter())
{
using (DataSet1.AssignedPPDataTable table = adapter.GetData(userId))
{
DataSet1.AssignedPPRow row = table.FindByUserIdmyPPId(
userId, myPPId);
if (row == null)
{
table.AddAssignedPPRow(userId, myPPId, string.Empty,
string.Empty, true);
}
else
{
row.Delete();
}
adapter.Update(table);
}
ts.Complete();
}
}
}
接続文字列は特別なものではありません。また
<add name="ConnectionString" connectionString="
Data Source=devdb;
Initial Catalog="TEST MSDTC";
Integrated Security=True"
providerName="System.Data.SqlClient" />
、ストアドプロシージャは、単純なCRUDの呼び出しです。
登録:
ALTER procedure [dbo].[p_UserForm_AssignedPP_Insert]
(
@UserId INT,
@myPPId int
)
AS
SET NOCOUNT ON;
INSERT INTO [UsermyPP] ([UserID],[myPPID],[DateCreated])
VALUES (@UserId,@myPPId,GETutcDATE())
読む:
ALTER procedure [dbo].[p_UserForm_AssignedPP_SelectByUserId]
(
@UserId int
)
AS
SELECT
[UserId],
[myPPId],
'' Title,
'' Abbreviation,
0 IsArchived
from
UsermyPP unpp
where
unpp.[userid] = @UserId
を削除します。偉大な情報のため
ALTER procedure [dbo].[p_UserForm_AssignedPP_Delete]
(
@Original_UserId INT,
@Original_MyPPId INT
)
AS
SET NOCOUNT ON;
DELETE FROM usermypp WHERE [UserID] = @Original_UserId
AND [MyPPID] = @Original_MyPPId
感謝を。私はMSDTCを使用したくないです。私はsql2005、1 dbを使用して、アプリのドメインを渡さないが、私は1つの接続を使用している場合はわからない。 dtcに昇格しない複数のSQL文を使用したトランザクションの簡単な例を挙げることはできますか? トランザクションがmsdtcに昇格されているかどうかを知るツールや他の方法はありますか? – muhan