2012-10-12 62 views
5

¿Qué hace DbConnection.EnlistTransaction?¿Qué hace DbConnection.EnlistTransaction?

+0

¿Mirar los documentos? http://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.enlisttransaction.aspx – DaveHogan

+0

No preguntaría aquí antes de comprobar allí ... –

+0

Los documentos, como se publicó anteriormente, lo describen perfectamente bien bajo "Observaciones". – DaveHogan

Respuesta

1

DbConnection.EnlistTransaction permite:

  • Junto a la conexión a un System.Transactions.Transaction. Tiene algunas limitaciones:
    • Si la conexión ya está participando en una transacción "local" (System.Data.Common.DbTransaction), puede fallar con una excepción (parece depender de la aplicación concreto conexión: Firebird 2 hace ninguna excepción tiro en tales situación, SqlConnection y probablemente la mayoría de los otros lo tiran).
    • Si la conexión ya se ha unido a otra System.Transactions.Transaction, y esta otra transacción aún está activa, fallará con una excepción.
    • Unirse a la misma transacción repetidamente es compatible, al menos por SqlConnection, OleDbConnection y OdbcConnection.
      Puede fallar si la conexión tiene algunos recursos actualmente en uso, como ser usado por un lector de datos abierto. (Este caso parece una comprobación demasiado temprana en la implementación interna de esas conexiones, hecho antes de darse cuenta de que ya se ha unido la transacción suministrada).
      Otras implementaciones de DbConnection pueden diferir.
  • Dejando una transacción en la que se enganchó la conexión, siempre que la transacción no esté más activa. (De lo contrario, intentar usar la conexión puede fallar con una excepción, al menos con OdbcConnection). Suministre null como una transacción para esto.
    Tenga en cuenta que algunas conexiones no son compatibles con esto, como SqlCeConnection, que arroja un NullReferenceException, y SQLiteConnection (al menos hasta v1.0.105), que arroja un ArgumentNullException.
    Se requiere dejar una transacción después de su finalización si desea usar la conexión para otras operaciones sin unirla en otra transacción. Algunas conexiones parecen dejar automáticamente la transacción, otras parecen no.

DbConnection.EnlistTransaction se usa generalmente con System.Transactions.Transaction.Current. No es necesario usarlo si la conexión se adquiere (abre) dentro de un TransactionScope: en tal caso, la conexión se enlista automáticamente en la transacción actual (a menos que su cadena de conexión dicte lo contrario con enlist=false).

3

Le permite coordinar transacciones entre conexiones múltiples. Una conexión se alistará automáticamente en una transacción si usa TransactionScope. De lo contrario, tienes que hacer el alistamiento con una transacción existente.

+0

El alistamiento automático está garantizado solo si la conexión se adquiere dentro del alcance de la transacción. Si se adquiere afuera, y luego se usa dentro, no se alistó. (Al menos lo he visto con una conexión que primero se adquirió bajo otro alcance de transacción: para usarlo con el siguiente (después de la primera finalización del alcance), se requería que explícitamente lo alistara). –