Actualización: Encontré un artículo que explica por qué las transacciones se promocionan desde LTM a MSDTC cuando solo se usan tanto GetData como Update en el mismo adaptador de datos dentro de un TransactionScope junto con una solución alternativa.
El TableAdapters + Transacciones definitiva entrada en el blog http://blah.winsmarts.com/2006/06/18/the-definitive-tableadapters--transactions-blog-post.aspx
entiendo la parte de tener múltiples conexiones abiertas a la vez la escalada de una transacción para ser distribuido. Sin embargo, tengo un problema donde solo hay una conexión y una consulta en contra de una base de datos que está escalando. No hay ninguna transacción en el procedimiento almacenado tampoco. Si alguien tiene una pista, me gustaría saber de ella. Desde mi ejemplo de código, el "adaptador. Actualización (tabla)" activará una transacción distribuida.
He sacado las entrañas del código de mi proyecto existente y simplifiqué casi todo lo que estaba pasando, y sigo teniendo los mismos problemas. Básicamente, esto crea un conjunto de datos con un adaptador de tabla y lo configura con un procedimiento almacenado para seleccionar, insertar y eliminar. Selecciono todos los registros relacionados con un usuario específico. Luego, dependiendo de si existe un "myPPID" para uno de los registros, lo agrego o elimino. Luego llamo al método de actualización y veo que la escalada de la transacción se distribuirá mirando las estadísticas de transacciones en los servicios de los componentes.
Estoy usando Windows XP Pro SP3 y .Net Framework 3.5 para el programa cliente. Se conecta a una base de datos SQL 2005 a través de LAN a 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();
}
}
}
La cadena de conexión es nada especial:
<add name="ConnectionString" connectionString="
Data Source=devdb;
Initial Catalog="TEST MSDTC";
Integrated Security=True"
providerName="System.Data.SqlClient" />
Además, los procedimientos almacenados son llamadas crud simples.
Crear:
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())
Leer:
ALTER procedure [dbo].[p_UserForm_AssignedPP_SelectByUserId]
(
@UserId int
)
AS
SELECT
[UserId],
[myPPId],
'' Title,
'' Abbreviation,
0 IsArchived
from
UsermyPP unpp
where
unpp.[userid] = @UserId
Eliminar:
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
Gracias por la gran información. Me encantaría no usar MSDTC. Estoy usando sql2005, 1 db, no estoy pasando dominios de aplicaciones, pero no estoy seguro si estoy usando 1 conexión. ¿Sería posible dar un pequeño ejemplo de una transacción con múltiples sentencias sql que no se elevarían a dtc? ¿Hay alguna herramienta o alguna otra forma de decir si mis transacciones se están elevando a msdtc? – muhan