transaction new framework begintransaction anidados c# .net sql-server transactions transactionscope

c# - new - transactionscope vs begintransaction



El error y el alcance de la transacción "La operación no es válida para el estado de la transacción" (4)

Recibo el siguiente error cuando intento llamar a un procedimiento almacenado que contiene una instrucción SELECT:

La operación no es válida para el estado de la transacción

Aquí está la estructura de mis llamadas:

public void MyAddUpdateMethod() { using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew)) { using(SQLServer Sql = new SQLServer(this.m_connstring)) { //do my first add update statement //do my call to the select statement sp bool DoesRecordExist = this.SelectStatementCall(id) } } } public bool SelectStatementCall(System.Guid id) { using(SQLServer Sql = new SQLServer(this.m_connstring)) //breaks on this line { //create parameters // } }

¿El problema es que estoy creando otra conexión a la misma base de datos dentro de la transacción?


He encontrado este error cuando mi transacción está anidada en otra. ¿Es posible que el procedimiento almacenado declare su propia transacción o que la función llamante declare uno?


También me encuentro con el mismo problema, cambié el tiempo de espera de la transacción a 15 minutos y funciona. Espero que esto ayude.

TransactionOptions options = new TransactionOptions(); options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; options.Timeout = new TimeSpan(0, 15, 0); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required,options)) { sp1(); sp2(); ... }


Cuando encontré esta excepción, había una InnerException "Tiempo de espera de transacción". Como esto fue durante una sesión de depuración, cuando detuve mi código durante algún tiempo dentro de TransactionScope, elegí ignorar este problema.

Cuando aparece esta excepción específica con un tiempo de espera en el código implementado, creo que la siguiente sección en su archivo .config lo ayudará:

<system.transactions> <machineSettings maxTimeout="00:05:00" /> </system.transactions>


Después de investigar un poco, parece que no puedo tener dos conexiones abiertas en la misma base de datos con el bloque TransactionScope. Necesitaba modificar mi código para que se vea así:

public void MyAddUpdateMethod() { using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew)) { using(SQLServer Sql = new SQLServer(this.m_connstring)) { //do my first add update statement } //removed the method call from the first sql server using statement bool DoesRecordExist = this.SelectStatementCall(id) } } public bool SelectStatementCall(System.Guid id) { using(SQLServer Sql = new SQLServer(this.m_connstring)) { //create parameters } }