Transacciones en .Net – TransactionScope (Clase)

Filed Under (.Net) by admin on 19-12-2008

Al crear una instancia de TransactionScope mediante la instrucción new, el administrador de transacciones determina en qué transacción va a participar. Una vez determinada, el ámbito siempre participa en esa transacción. La decisión se basa en dos factores: si está presente una transacción de ambiente y el valor del parámetro TransactionScopeOption del constructor. La transacción de ambiente es aquélla en la que se ejecuta el código. Puede obtener una referencia a la transacción de ambiente llamando a la propiedad Current estática de la clase Transaction. Para obtener más información sobre la utilización de este parámetro, consulte la sección sobre administración del flujo de transacciones del tema Implementar una transacción implícita con el ámbito de transacción.

Si no se produce ninguna excepción dentro del ámbito de la transacción (es decir, entre la inicialización del objeto TransactionScope y la llamada de su método Dispose), entonces se permite que la transacción en la que participa el ámbito continúe. Si aparece una excepción dentro del ámbito de la transacción, se deshará la transacción en la que participa.

Cuando la aplicación termina todo el trabajo que tiene que llevar a cabo en una transacción, debe llamar al método Complete sólo una vez para notificar al administrador de transacciones que la transacción se puede confirmar. Si no se puede llamar a este método se anula la transacción.

Una llamada al método Dispose marca el fin del ámbito de la transacción. Las excepciones que aparecen después de llamar a este método quizá no afecten a la transacción.

Si modifica el valor de Current dentro de un ámbito, se produce una excepción cuando se llama al método Dispose. Sin embargo, al final del ámbito, se restaura el valor anterior. Además, si se llama a Dispose en Current dentro del ámbito de transacción que creó la transacción, la transacción se anula al final del ámbito

En el ejemplo siguiente se muestra cómo utilizar la clase TransactionScope para definir un bloque de código para participar en una transacción.

Visual Basic

Copiar código

'  This function takes arguments for 2 connection strings and commands to create a transaction 
'  involving two SQL Servers. It returns a value > 0 if the transaction is committed, 0 if the 
'  transaction is rolled back. To test this code, you can connect to two different databases 
'  on the same server by altering the connection string, or to another 3rd party RDBMS  
'  by altering the code in the connection2 code block.
Public Function CreateTransactionScope( _
  ByVal connectString1 As String, ByVal connectString2 As String, _
  ByVal commandText1 As String, ByVal commandText2 As String) As Integer

    ' Initialize the return value to zero and create a StringWriter to display results.
    Dim returnValue As Integer = 0
    Dim writer As System.IO.StringWriter = New System.IO.StringWriter

    ' Create the TransactionScope to execute the commands, guaranteeing
    '  that both commands can commit or roll back as a single unit of work.
    Using scope As New TransactionScope()
        Using connection1 As New SqlConnection(connectString1)
            Try
                ' Opening the connection automatically enlists it in the 
                ' TransactionScope as a lightweight transaction.
                connection1.Open()

                ' Create the SqlCommand object and execute the first command.
                Dim command1 As SqlCommand = New SqlCommand(commandText1, connection1)
                returnValue = command1.ExecuteNonQuery()
                writer.WriteLine("Rows to be affected by command1: {0}", returnValue)

                ' If you get here, this means that command1 succeeded. By nesting
                ' the using block for connection2 inside that of connection1, you
                ' conserve server and network resources as connection2 is opened
                ' only when there is a chance that the transaction can commit.   
                 Using connection2 As New SqlConnection(connectString2)
                    Try
                        ' The transaction is escalated to a full distributed
                        ' transaction when connection2 is opened.
                        connection2.Open()

                        ' Execute the second command in the second database.
                        returnValue = 0
                        Dim command2 As SqlCommand = New SqlCommand(commandText2, connection2)
                        returnValue = command2.ExecuteNonQuery()
                        writer.WriteLine("Rows to be affected by command2: {0}", returnValue)

                    Catch ex As Exception
                        ' Display information that command2 failed.
                        writer.WriteLine("returnValue for command2: {0}", returnValue)
                        writer.WriteLine("Exception Message2: {0}", ex.Message)
                    End Try
                End Using

            Catch ex As Exception
                ' Display information that command1 failed.
                writer.WriteLine("returnValue for command1: {0}", returnValue)
                writer.WriteLine("Exception Message1: {0}", ex.Message)
            End Try
        End Using

        ' The Complete method commits the transaction. If an exception has been thrown,
        ' Complete is called and the transaction is rolled back.
        scope.Complete()
    End Using

    ' The returnValue is greater than 0 if the transaction committed.
    If returnValue > 0 Then
        writer.WriteLine("Transaction was committed.")
    Else
       ' You could write additional business logic here, for example, you can notify the caller 
       ' by throwing a TransactionAbortedException, or logging the failure.
       writer.WriteLine("Transaction rolled back.")
     End If

    ' Display messages.
    Console.WriteLine(writer.ToString())

    Return returnValue
End Function

Mas información en la web de Micorsoft: http://msdn.microsoft.com/es-es/library/system.transactions.transactionscope(VS.80).aspx 

La fábula del pastor y el jefe de proyectos

Filed Under (Grandes Verdades) by admin on 04-12-2008

Paseaba un día un jefe de proyectos por el campo. Tras años de rayos catódicos era su primer paseo por el páramo castellano en mucho tiempo. Lo necesitaba. La ocasión merecía los pantalones y las botas que estrenaba, recién compradas en la tienda de Timberland del aeropuerto. Iba pensando en lo bucólico del paisaje y la paz que se respiraba y lo lejos que estaba ahora de las reuniones ‘tressesenta’ , cuando vio, en la lejanía, para un informático 350 metros son la lejanía, un pastor de ovejas con rebaño de discreto tamaño. No más de cincuenta recursos eran los que el pastor gestionaba.En ese preciso instante el modesto pastor vio al ‘pimpollo’ y pensó… vaya, otro que estrena botas, mañana con ampollas… mientras arrancaba un lasca de queso con su navaja. En esto el ‘pinpollo’ ya estaba a su lado. El pastor levanto la cabeza, miro a nuestro jefe de proyecto y le tendió un trozo de queso. Ya se sabe, que en la castilla profunda, la hospitalidad se muestra más de gesto que de palabra.

El jefe de proyecto cogió el queso, sin poder evitar pensar: ‘que uñas más negras’. Y se sentó junto al pastor. La botas le estaban matando. Degusto el queso, que le supo como le sabía el queso cuando tenía forma de queso y no forma de triángulo metido en un plástico. Y ya se sabe, un buen queso puede tener efectos tan alucinógenos como el LSD. Sobre todo si no se ha probado en años… y no sale de la máquina de la sala de café después de poner dos euros y pulsar sesenta y siete.

Así que embriagado por los aromas de aquel queso, el jefe de proyecto no pudo evitar decir: ’señor pastor, lo suyo si que es vida’. El pastor le miro, sin decir nada. ‘Todo el día dedicado a usted mismo, con sus fieles recursos que nunca se oponen a su voluntad, que saben lo que deben hacer sin que nadie se lo diga, que no están todo el día exigiendo y pensando en irse a su hora a casa. Lo que daría yo por estar en su situación… ‘ continuó el jefe.

El pastor le miró y con la simpleza que solo da la verdadera sabiduría dijo: ‘no sabe usted de lo que habla, amigo’. Y tiro un largo trago de bota. El jefe de proyecto no se iba a amilanar, así que espetó: ‘Usted si que no sabe nada de lo duro que es mi trabajo, seguro que yo cuidaría mejor de sus ovejas que usted de mi equipo de desarrolladores’. El pastor le miró fijamente y dijo ‘hecho, escriba aquí la dirección de su empresa y avise de que voy’. Le tendió la bota al jefe, en un gesto que decía claramente que si bebía, el trato estaba cerrado. Y claro, el jefe bebió mientras pensaba, ‘que cojones, aquí el que tiene el MBA soy yo’.

El pastor se levantó, silbó a su perro y le dijo, ‘dentro de unas semana vuelvo, de mientras, obedece a este pinpollo’… El perro le miró con incredulidad y acatamiento. Le dio el petate al ‘pipollo’ y marcho a conocer a su nuevo rebaño. No se sabe quien estaba más acojonado, si el jefe de proyecto o el pastor.

Pasado el estupor inicial, el jefe penso: ‘bueno se trata de gestionar recursos ¿no? Llevo haciendo eso años. Seguro que las ovejas saben hacer mejor su trabajo que los desarrolladores. Tengo claro el objetivo, que den lana, y solo necesito crear un plan y exigir su cumplimento’. Con un buen plan y mano férrea seguro que lograba cumplir sus objetivos. El jefe respiró tranquilo cuando recordó que llevaba su flamante PDA y que tenia Project y Excel versión requetemini. Todo estaba solucionado. Dedicó esa noche a trazar un plan. Fue una dura noche, lloviendo y tronando. Las ovejas durmieron a la intemperie, pero no pasaba nada, el tenía ‘el plan’. 50 recursos de tipo oveja, a 50 kilos de lana por recurso, 2500 kilos de lana. Un proyecto rentable sin duda…

Al día siguiente el jefe reunió al rebaño. ‘Tengo un plan que nos va a llevar a completar el proyecto de manera exitosa. Ya me he comprometido con el señor alcalde, cacique local y comerciante de lana, a entregarle 2500 kilos de la mejor lana en el plazo de dos meses. El alcalde me ha hecho saber su satisfacción y su plena confianza en que conmigo al frente, MBA y gestor de recursos experto, el proyecto va a ser todo un éxito.’ Las ovejas no entendían nada. Ellas sabían que el alcalde solía preocuparse más por la leche que por la lana, pero quizás las cosas habían cambiado, que sabían ellas, meros recursos productores de ¿lana? ¿leche?… En cualquier caso, la ovejas, no habían nunca producido tanta lana en tan poco tiempo pero con un buen gestor al mando quizás se obrase el milagro. El project que el jefe tenía era muy bonito… que barritas azules más iguales, oye.

Pasaron veinte días y el jefe de proyecto reunió de nuevo a las ovejas. ‘Queridas ovejas, vamos retrasados respecto mi plan. No dudo de que haréis lo necesario para asegurar que producís la lana al ritmo necesario. Espero que todas arriméis el hombro y que no os vayáis a casa sin cumplir con vuestro trabajo. Ya he hablado con el alcalde y le he dicho que no se preocupe que apretaremos nuestro culo bobino y recuperaremos el tiempo perdido’. Las ovejas no entendían nada, ya se sabe que no es un animal demasiado listo… apretaron su ovino culo y se fueron a pastar. Al fin y al cabo no sabían como hacer crecer la lana más rápido… y parecía que el jefe tampoco.

Otros veinte días después, el jefe de proyecto reunió de nuevo al rebaño. ‘Malditas ovejas. Os pedí un esfuerzo y no habéis hecho nada. Yo hice el plan y vosotras estáis haciendo que fracase. Como no os apliquéis más algunas de vosotras vais a ir a la *** calle. Y ya sabéis la crisis que hay… puedo encontrar cincuenta como vosotras en cualquier ETT’. La ovejas, una vez más, no entendieron nada. Ya le habían dicho al jefe de proyecto que el que no las metiese en el corral por las noches y que no las hubiese cambiado de prado en todo el tiempo no era muy beneficioso para su lana. Habían pensado que a lo mejor si se movían por el campo como hacían con el pastor, la producción de lana mejorase. También sugerían que el jefe las ordeñase, sabían que el alcalde siempre quería leche… ‘Estas ovejas, siempre quejándose de chorradas, ya sabía yo que no eran muy diferentes a los desarrolladores. Que sigan el plan y dejen de quejarse y pensar, para eso ya estoy yo. ¡No hay manera de hacer que trabajen!’ había pensado el jefe de proyecto.

Otros veinte días después el alcalde llegó y preguntó al jefe por su lana… el jefe solo tenía 1000 kilos, la ovejas resultaron no ser tan expertas como ponía en su curriculum, inaceptable… que podría haber hecho él… ‘No pasa nada jefe’, dijo el alcalde, ‘tendremos mucha leche entonces’. El jefe se puso rojo y dijo ‘leche, que leche, en el contrato no decía nada de leche’… El alcalde dijo, ‘me la sopla lo que diga el contrato, lo de la leche se da por supuesto, vaya fracaso del proyecto, no vas a ver un *** duro…’.

En esas llegó el pastor… seguro que el también la habría cagado. ‘Mal de muchos, consuelo de tontos, pero consuelo al fin y al cabo’ pensó el jefe… ‘¿Qué tal pastor? ¿Duro el trabajo?’ dijo con tonillo de sorna. El pastor contesto, con su simpleza natural: ‘Todo ha ido sobre ruedas. Al fin y al cabo los desarrolladores son como ovejas ¿no? Seguro que a ti también te ha ido bien. Los desarrolladores incluso me han regalado un GPS para que marque donde comen mejor mis ovejas… ¡y donde hay setas!. Creo que me han cogido cariño los jodidos, que majetes’. El jefe no salía de su asombro. Los recursos eran agradecidos y todo. ¡Cuéntame que has hecho, por favor!, dijo al pastor.

‘Ha sido fácil. Al fin y al cabo los desarrolladores son mucho más comunicativos que las ovejas y cuesta menos reunirlos. Todas las mañanas, sin perro ni nada, les tenía localizados. Además, pensé, no pueden ser muy diferentes que las ovejas, son individualistas y gregarios a la vez. Seguro que si cuido de ellos como hago con mis ovejas obtendré los resultados esperados y a eso me he dedicado estas semanas.’

El pastor continuo ‘me pidieron que les consiguiese un servidor de 64 bits para no se que pruebas de rendimiento y de compatibilidad. Yo no tenía ni idea de qué es eso, pero parecía importante para ellos, así que lo conseguí. ¿No busco los mejores pastos para mi ovejas? No es tan diferente…’ El jefe de proyecto flipaba, ¿desde cuándo se logra algo de los recursos atendiendo a sus caprichos?…

Luego prosiguió el pastor contando otra situación: ‘Un día, los desarrolladores dijeron que no lograban que el rendimiento fuese el adecuado, y que en su opinión lo mejor era tirar de un experto. Así que eso hice busque un experto que les ayudase y les formase. ¿No llevo a mis ovejas al veterinario cuando tienen problemas?’. Ahora sí que el jefe de proyecto no se lo podía creer, ¡formar a los recursos es caro! Y luego se van a la competencia en cuanto saben.

‘Me acuerdo de otra cosa curiosa’, dijo el pastor: ‘Otro día los desarrolladores me contaron que no lograban avanzar. Eso me preocupó. ¿Se supone que los desarrolladores deben avanzar en la funcionalidad, es su lana y su leche, no?. El problema, contaron, es que los comerciales estaban continuamente demandando pequeñas modificaciones, visitas a clientes, que atendiesen llamadas… Parece que los lobos acechan, pensé yo. Así que puse un poco de orden y deje claro que a mi rebaño no se le molesta’.

El pastor concluyo: ‘la verdad es que no he hecho mucho ¿no?. Los desarrolladores son como las ovejas, si dejas que hagan su trabajo y pones las condiciones para que lo hagan, al final puedes recoger los resultados’.

En estas despertó el jefe de proyecto y pensó: ‘joder, como pega el vino del pastor, vaya siesta y vaya sueño más raro’, mientras veía al pastor perderse por el horizonte con su rebaño.

Yo me pregunto: ¿A que se parece más el trabajo de Scrum Master, cuyo principal cometido es eliminar los impedimentos que encuentra el equipo, al de un Jefe de Proyecto clásico o al de un pastor?.

Ya lo dijeron DeMarco y Lister en su imprescidible Peopleware, el trabajo del gestor de proyectos no es hacer que la gente trabaje, sino construir el entorno en el que trabajar sea posible.

Publicado el lunes, 24 de noviembre de 2008 23:42 por Rodrigo Corral