You are on page 1of 15

Transacciones

Acrnimo A.C.I.D Atomicidad: Todas las operaciones deben unificarse como si fuera una sola. Consistencia: Cualquier operacin realizada no debe romper la integridad de los datos. Isolation Level (nivel de aislamiento): la base de datos debe aislar los datos sucios para evitar que otros usuarios los usen. Durabilidad: los datos confirmados no pueden perderse.

Transacciones
Breve resea del concepto Ejemplo: (un usuario intenta ejecutar una serie de comandos que representan una transferencia de $100 de una cuenta a la otra): Ocurre un error al intentar 1) Restar de la cuenta A $100 ejecutar esta operacin 2) Sumar en la cuenta B $100
Resultado: Los datos quedan inconsistentes y el cliente pierde $100 en su balance

Transacciones
Breve resea del concepto Ejemplo: (un usuario intenta ejecutar una serie de comandos que representan una transferencia de $100 de una cuenta a la otra): Ocurre un error al intentar ejecutar esta 1) Restar de la cuenta A $100 operacin y todas las operaciones de la 2) Sumar en la cuenta B $100 transaccin quedan
Transaccin sin efecto

Resultado: Los datos quedan consistentes y vuelven a su estado original. El cliente mantiene intacto su balance

Transacciones
Breve resea del concepto Otro caso puede darse con operaciones concurrentes. Por ejemplo, si un usuario desea comprar 100 unidades de un producto, lee el stock, verifica que hay suficiente, y mientras coloca el pedido, otro usuario realiza una compra similar dejando en 0 el stock. El negocio no tendr mercadera para hacer frente al pedido del usuario que coloc el pedido online (y que quizs ya pag) . Para que esto no ocurra debera existir cierto nivel de bloqueo de los datos ledos y/o modificados hasta tanto la operacin (el conjunto de comandos) se termine de procesar totalmente.

Transacciones
ADO.NET provee soporte para transacciones mediante el objeto DbTransaction.
Este objeto tambin es dependiente del proveedor de datos. Para MS SQL Server se llama SqlTransaction. Una transaccin se inicia (e instancia) desde el objeto de conexin con el mtodo BeginTransaction, y se finaliza desde el objeto de transaccin creado (con el mtodo Commit() para confirmar las operaciones y con el mtodo RollBack() para cancelar las operaciones).

Transacciones
Ejemplo:
Dim mCon as New DBlConnection(mStrCon) mCon.Open() Dim mTr as DblTransaction = mCon.BeginTransaction() Try
Dim mCom as New DBlCommand mCom.Connection = mCon mCom.Transaction = mTr Dim mStrCommandText As String = String para restar los $100 mCom.CommandText = mStrCommandText mCom.ExecuteNonQuery Dim mStrCommandText As String = String para sumar los $100 mCom.CommandText = mStrCommandText mCom.ExecuteNonQuery mTr.Commit()

Catch ex as Exception mTr.RollBack() Finally mCon.Close() End Try

Transacciones
Las transacciones pueden tener diferentes niveles de aislamiento, es decir, diferentes maneras de comportarse frente a operaciones concurrentes. Los niveles de aislamiento solo se pueden especificar en el constructor de la transaccin. Ej:
mCon.BeginTransaction(IsolationLevel.ReadCommitted)

Transacciones
Los niveles soportados por SQL son: ReadUncommitted: No distingue bloqueos por lectura y escritura. Puede producir lecturas sucias (datos desde dentro de la trasaccin).
ReadCommited (predeterminado): Distingue bloqueos por lectura y escritura. Soluciona el problema de la lectura sucia. Ante una segunda consulta pueden aparecer problemas de Lectura no repetitiva (filas que fueron eliminadas) o Filas fantasmas (filas que se agregaron)

RepeatableRead: Establece bloqueos exclusivos en todas las filas. Soluciona el problema de Lectura no repetitiva pero pueden producirse filas fantasmas.
Serializable: Se emite un bloqueo exclusivo en todo el rango. Se elimina el problema de filas fantasmas. (es el mtodo menos eficiente)

Transacciones ADO.NET 2
ADO.NET 2.0 introduce un nuevo esquema de transacciones ms escalable y fcil de utilizar (aunque contina soportando el esquema anterior).
Una gran ventaja es que no solo soporta transacciones locales, sino que soporta de manera transparente transacciones distribuidas (distintas bases de datos, distintas aplicaciones, distintos equipos) Microsoft .NET Framework 2.0 incorpora el espacio de nombres System.Transactions
NOTA: Hay diferencias con Balena 2003

Transacciones ADO.NET 2
Su funcionamiento bsico consiste en generar un mbito de transaccin mediante la clase TransactionScope
Cada nueva operacin que pueda ser sujeta a transaccin detecta automticamente la existencia de un mbito de transaccin abierto y se enlista en Transaction.Current (transaccin actual)
NOTA: Hay diferencias con Balena 2003

Transacciones ADO.NET 2
TransactionScope posee un atributo lgico Consistency que indica si el estado de la transaccin es consistente (por defecto en false). Cuando TransactionScope est finalizando (ejecutando su mtodo Dispose) verifica este atributo. Si est en false se ejecuta implcitamente un RollBack, sino se ejecuta un Commit.
Invocando el mtodo Complete() del TransactionScope se establece ese atributo en true automticamente.

NOTA: Hay diferencias con Balena 2003

Transacciones ADO.NET 2
Ejemplo:
Imports System.Transactions Using mTrs as New TransactionScope Try Dim mCon as New SqlConnection(mStrCon) mCon.Open Dim mCom as SqlCommand mCom = New SqlCommand(UPDATE 1, mCon).ExecuteNonQuery mCom = New SqlCommand(UPDATE 2, mCon).ExecuteNonQuery mCom = New SqlCommand(UPDATE 3, mCon).ExecuteNonQuery Catch ex as SqlException MsgBox(ex.Message) End Try mTrs.Complete() End Using

NOTA: Hay diferencias con Balena 2003

Transacciones ADO.NET 2
Hasta este nivel la transaccin se mantiene como una transaccin local. Si se agrega una conexin ms al mbito de transaccin (sea de un servidor local o de otro equipo) la transaccin (Current) se promueve automticamente a transaccin distribuida sin cambios en el cdigo.
NOTA: Hay diferencias con Balena 2003

Transacciones ADO.NET 2
Cuando una transaccin se convierte en distribuida comienza a interactuar automticamente a bajo nivel con un servicio del sistema operativo llamado DTC (Distributed Transactions Coordinator). Este servicio coordina las transacciones con los motores de bases de datos mediante el protocolo OLETx (OLE Transactions)

NOTA: Hay diferencias con Balena 2003

Transacciones ADO.NET 2
Ejemplo de transaccin distribuida:
Imports System.Transactions Using mTrs as New TransactionScope Try Dim mCon1 as New SqlConnection(mStrCon1) Dim mCon2 as New SqlConnection(mStrCon2) mCon1.Open() mCon2.Open() Dim mCom as SqlCommand mCom = New SqlCommand(UPDATE 1, mCon1).ExecuteNonQuery mCom = New SqlCommand(UPDATE 2, mCon2).ExecuteNonQuery Catch ex as SqlException MsgBox(ex.Message) End Try mTrs.Complete() End Using

NOTA: Hay diferencias con Balena 2003

You might also like