Обновление: я нашел статью, в которой объясняется, почему транзакции продвигаются из LTM в MSDTC, когда используются только GetData и Update на одном адаптере данных в TransactionScope вместе с обходным путем.
Полная запись в блоге TableAdapters + Transactions 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 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" />
Кроме того, хранимые процедуры - это простые грубые вызовы.
Создавать:
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
person
Lewie
schedule
14.05.2010