Обновление: я нашел статью, в которой объясняется, почему транзакции продвигаются с использованием LTM в MSDTC, только при использовании GetData и Update на одном и том же адаптере данных в TransactionScope вместе с обходным путем.
Окончательный TableAdapters + Сделки блог http://blah.winsmarts.com/2006/06/18/the-definitive-tableadapters--transactions-blog-post.aspx
Я понимаю часть о наличии нескольких открытых соединений сразу эскалации сделки по распределению. Однако у меня возникла проблема, когда есть только одно соединение и один запрос к базе данных, которая ее наращивает. В хранимой процедуре нет никаких транзакций. Если кто-нибудь подскажет, я хотел бы услышать об этом. Из моего примера кода «adapter.Update (table)» инициирует распределенную транзакцию.
Я извлек из моего проекта извлечения из кода и упростил большую часть того, что происходило, и у меня все те же проблемы. Это в основном создает набор данных с адаптером таблицы и настраивает его с помощью хранимой процедуры для выбора, вставки и удаления. Я выбираю все связанные записи с конкретным пользователем. Затем, в зависимости от того, существует ли «myPPID» для одной из записей, я добавляю его или удаляю. Затем я вызываю метод обновления и вижу, что эскалация транзакций должна быть распределена путем просмотра статистики транзакций в службах компонентов.
Я использую Windows XP Pro SP3 и .Net Framework 3.5 для клиентской программы. Он подключается к базе данных SQL 2005 по локальной сети до Windows Server 2003 R2 Enterprise Edition с пакетом обновления 2 (SP2).
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())
Read:
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 соединение. Можно ли привести короткий пример транзакции с несколькими операторами sql, которые не будут добавлены в dtc? Есть ли инструмент или какой-либо другой способ узнать, повышены ли мои транзакции до msdtc? – muhan