Cómo evitar escalar a MSDTC en LINQ 2 SQL -- sql-server campo con linq-to-sql camp Relacionados El problema

How to avoid escalating to MSDTC in linq 2 sql


0
vote

problema

Español

Tengo la siguiente situación:

  • aplicación utiliza 2 bases de datos
  • En algún momento, necesito usar un tipo de transacción:

    Insertar tabla de grabación una base de datos x

    Insertar la tabla de grabación C Datos de datos Y

    sumitchanges

    Insertar la tabla de registros B Base de datos X (uno de los campos de B tiene el valor del ID de la clave principal de A, por eso necesito llamar a Submitchanges)

    sumitchanges

    a & amp; B debe tener éxito, o fallar juntos. C no importa El inserto en C active el error MSDTC no está disponible. Pero no quiero que C forme parte de la transacción (por cualquier motivo) Sé que normalmente cuando serían una relación entre A y B, el valor (FKID) se llenaría automáticamente, pero no puedo usar la relación FK en este caso. (Supongo que no hay manera de obtener la identificación de A en B sin usar FK?)

    Intenté especificar enlist = FALSE en la cadena de conexión de Y solo, o incluso en X e Y, pero todavía obtengo el error.

Original en ingles

I have following situation :

  • application uses 2 databases
  • at some point, I need to use a transactionscope:

    insert record table A database X

    insert record table C database Y

    submitchanges

    insert record table B database X (one of the fields of B has the value of the primary key id of A that's why I need to call submitchanges)

    submitchanges

    A & B must both be successfull, or fail together. C doesn't matter. Insert on C does trigger the error MSDTC is nog available. But I don't want C to be part of the transaction ( for whatever reason ) I know that normally when they would be a relationship between A and B, the value (FKid) would be filled automatically, but I can not use FK relationship in this case. (I guess there is no way of getting the id of a into b without using FK?)

    I tried to specify enlist=false on the connectionstring of Y only, or even on both X and Y but I still get the error.

     

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Cuando se promueve una transacción a partir de una transacción local a una transacción distribuida, en mi opinión, no siempre es fácil saber, y he experimentado lugares donde esperaría que fuera una transacción local, donde se ha promovido a una distribuida. Transacción, que requiere DTC.

Sin embargo, ejecutar explícitamente el inserto en la base de datos y en una transacción diferente podría resolver el problema. A continuación, puede especificar explícitamente una transacción con TransactionScope.Suppress o TransactionScope.RequiresNew :

http://msdn.microsoft.com/en- EE. UU. / Library / System.Transactions.TransactionsCopeoption.aspx

  // Update table A in database X // ...   using(TransactionScope scope = new TransactionScope(           TransactionScopeOption.RequiresNew     )) {    // Update table C in database Y    ...    scope.Complete(); }  // Update table B in database X   

Sin embargo, pregúntese, ¿es el inserto en la Tabla C en la base de datos y totalmente independiente en el primer inserto en la Tabla A en la base de datos X? Si no, ¿qué sucede si el inserto en la Tabla B en la base de datos X falla, es el inserto en la Tabla C en la base de datos Y aún es válida? ¿O podría terminar con datos inconsistentes? Y, si es así, ¿importa lo suficiente para que usted traiga DTC a la sopa?

 

When a transaction is promoted from a local transaction to a distributed transaction is in my opinion not always easy to know, and I have experienced places where I would expect it to be a local transaction, where it has been promoted to a distributed transaction, requiring DTC.

However, explicitly running the insert into database Y in a different transaction could solve the issue. You can then explicitly specify a transaction with TransactionScope.Suppress or TransactionScope.RequiresNew:

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscopeoption.aspx

// Update table A in database X // ...   using(TransactionScope scope = new TransactionScope(           TransactionScopeOption.RequiresNew     )) {    // Update table C in database Y    ...    scope.Complete(); }  // Update table B in database X 

However, ask yourself, is the insert into table C on database Y totally independent on the first insert in table A in database X? If not, what if the insert into table B in database X fails, is the insert into table C on database Y still valid? Or might you end up with inconsistent data? And, if so, does it matter enough for you to bring DTC into the soup?

 
 
0
 
vote

MSDTC es el coordinador de transacciones distribuidas. Cuando intenta actualizar múltiples bases de datos dentro de una transacción, la transacción se intensificará a MSDTC. MSDTC debe habilitarse en el (los) servidor (es) de la base de datos y el cliente, creo. Si desea evitar esta escalada, deberá tener dos transacciones separadas (usando dos conexiones separadas), una para la base de datos X y otra para la base de datos Y.

 

MSDTC is the distributed transaction coordinator. When you attempt to update multiple databases within a transaction, the transaction will be escalated to MSDTC. MSDTC must be enabled on the database server(s) and the client, I believe. If you want to avoid this escalation, you'll need to have two separate transactions (using two separate connections), one for database X and one for database Y.

 
 

Relacionados problema

33  ¿Las clases de DataContext múltiples son adecuadas?  ( Are multiple datacontext classes ever appropriate ) 
Para usar completamente linqtosql en una aplicación ASP.NET 3.5, es necesario crear datacontext Clases (que suele ser Hecho usando el diseñador en VS 2008...

6  ¿Cómo abstrae su código de persistencia al usar LINQ a SQL?  ( How do you abstract out your persistence code when using linq to sql ) 
Amo a Linq a SQL, pero me ha estado molestando que al usarlo, mi código de repositorio se gana el marco de Linq a SQL y, por lo tanto, acoplado firmemente a u...

0  LINQ2SQL: la construcción explícita del tipo de entidad '#Some Tipo #' en la consulta no está permitido, también usando unirse  ( Linq2sql explicit construction of entity type some type in query is not all ) 
Estoy teniendo un mapeo de problemas. Estaba leyendo Scottgu Post of "Data Formación de características" - http://weblogs.asp.net/scottgu/archive/2007/06/29/...

3  Mejores prácticas generales para actualizar un registro y sus relaciones asociadas en Linq-to-SQL  ( General best practice for updating a record and its associated relationships in ) 
Tengo una pregunta muy general sobre la actualización de un registro en Linq-to-SQL. Supongamos que, en mi modelo de datos, tengo un registro base (tabla de t...

6  La subconsina no se admite en 'isdeleted' de tipo 'entidades.product'  ( Subquery is not supported on isdeleted of type entities product ) 
Estoy usando LINQ a SQL y estoy tratando de filtrar los datos usando DATAOPTIONS y AssociateWith. Tengo una tabla llamada productos que tienen una clave princ...

4  ¿Cómo codificar las extensiones parciales que Linq a SQL Autogeneda?  ( How to code the partial extensions that linq to sql autogenerates ) 
Hice una clase de Linq a SQL Clease con el marco de SP1 VS 2008 3.5 SP1, en este caso, extendí el parcial partial void UpdateMyTable(MyTable instance){ ...

1  Generar una unión completa con linqtosql  ( Generate full join with linqtosql ) 
Tengo esta consulta LINQ: (from rapportBase in New_RapportReferencementBases join rapportExtensionAll in New_RapportReferencementExtensionBases on rapport...

3  Linq2SQL Insertar registros a tablas relacionadas  ( Linq2sql insert records to related tables ) 
Situación similar a: Cómo agregar varios registros dependientes con linq2sql < / a> (Esto parece lógico, pero no funciona para mí) ASP.NET MVC + LINQ2SQL ...

2  Recuperando un objeto mediante el uso del método de GetTable a través de DataContext  ( Retrieving one object by using gettable method over datacontext ) 
Tengo una clase heredada de Datacontext para usar LINQ. public class Context : DataContext { public Context(string connectionString) : base(con...

3  El uso de una clase Linq-to-SQL genera automáticamente la cadena de conexión para mí; ¿Hay alguna manera de establecerlo manualmente?  ( Using a linq to sql class automagically generates the connection string for me ) 
Estoy empezando a usar Linq-to-SQL y es simplemente maravilloso de usar. El problema es que este software se ejecutará en muchas máquinas y cada máquina tendr...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos