更新:回避策とともに、TransactionScope内の同じデータアダプターでGetDataとUpdateの両方を使用する場合にのみ、トランザクションがLTMからMSDTCにプロモートされる理由を説明する記事を見つけました。
決定的なTableAdapters+Transactionsブログ投稿
http://blah.winsmarts.com/2006/06/18/the-definitive-tableadapters--transactions-blog-post.aspx
一度に複数の接続を開いて、分散するトランザクションをエスカレートすることについての部分を理解しています。ただし、接続が1つだけで、それをエスカレートしているデータベースに対するクエリが1つしかないという問題があります。ストアドプロシージャにもトランザクションはありません。手がかりがあれば聞いてみたいです。私のコード例から、「adapter.Update(table)」は分散トランザクションをトリガーします。
私は既存のプロジェクトからコードの内臓を取り除き、進行中のほとんどを単純化しましたが、それでも同じ問題が発生しています。これは基本的に、テーブルアダプタを使用してデータセットを作成し、選択、挿入、および削除するためのストアドプロシージャを使用してデータセットを設定することです。特定のユーザーに関連するすべてのレコードを選択します。次に、レコードの1つに「myPPID」が存在するかどうかに応じて、それを追加または削除します。次に、updateメソッドを呼び出し、コンポーネントサービスのトランザクション統計を監視して、トランザクションが分散されるようにエスカレートすることを確認します。
クライアントプログラムにWindowsXPProSP3と.NetFramework3.5を使用しています。LAN経由でSQL2005データベースに接続し、Windows Server 2003 R2 EnterpriseEditionSP2に接続します。
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" />
また、ストアドプロシージャは単純なクラッド呼び出しです。
作成:
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