Sunday February 5th 2012

Insider

Archives

Isolation Levels

256

        Los niveles de “isolation” de una transacción en JDBC determinan si el nivel de la transacción que se está corriendo en la base de datos puede afectar a otro o no.

Si hay dos o más transacciones accediendo a la base de datos concurrentemente, se necesita prevenir las acciones de las transacciones para que estas no interfieran con las otras.

Esto puede realizarse usando niveles de “isolation” en JDBC.

Algunos problemas comunes que pueden ocurrir al acceder a la base de datos simultáneamente son:

Dirty Reads (Lecturas Sucias):

Este problema es también conocido como “uncommitted dependency problem”.

Y puede ser explicado por el siguiente ejemplo:

Un empleado está realizando cambios al documento de políticas de la empresa. Cuando los cambios están realizándose, otro empleado toma una copia del documento que incluye todos los cambios hechos anteriormente y distribuye estos a toda la empresa.

Entonces en eso los cambios que hizo el primer empleado se terminaron de hacer, pero para esto ya hay una copia de un documento en toda la empresa, y el problema es que este documento que ya fue distribuido, ya no es el actual.

La solución a este problema sería no permitir que alguien lea el documento hasta que el primer empleado haya guardado todos los datos al documento.

La interface Connection de la API JDBC provee las siguientes propiedades como valores enteros para colocar el nivel de “isolation”.

 

TRANSACTION_READ_LEVEL: Provee el nivel más bajo de “isolation” entre todos las transacciones que están siendo ejecutadas.

  • Este nivel de isolation no previene de los dirty reads, non-repeatable reads y phanton reads.
  • Este nivel únicamente previene leer los datos que están corruptos físicamente.
  •  

TRANSACTION_READ_COMMITED: este nivel previene los dirty reads, sin embargo los otros problemas como phantom-reads y non-repetable reads siempre pueden ocurrir en este nivel.

 

TRANSACTION_REPEATABLE_READ: Este nivel previene los dirty-reads, y los non-repetable-reads.

Este nivel previene que la transacción actualice los datos que están siendo utilizados por otra transacción.

 

TRANSACTION_SERIALIZABLE: Este provee el nivel más alto de isolation entre todas las transacciones que están siendo procesadas.

Este nivel es para prevenir todos los problemas que pueden ocurrir, como dirty-reads, non-repetable-reads y phantom-reads.

Lo que hace este nivel es que bloquea las filas que están siendo utilizadas en otra transacción hasta que ese nivel se cierra, por lo tanto en medio de una transacción esos datos no puedes ser leído sin modificados.

 

La interface Connection contiene el método getTransactionIsolationLevel() y setTransactionIsolationLevel() para obtener o “setear” el valor.

El método getTransactionIsolationLevel no toma argumentos, y retorna un valor entero.

 

Para utilizarlo podemos ver el siguiente código:

Connection con = DriverManager.getConnection(“jdbc:odbc:probandoDS”,”user”,”pass”);
 
int transLevel = getTransactionIsolationLevel():

y para setear el tipo de nivel de “isolation” se realiza lo siguiente:

con.setTransactionIsolationLevel(TRANSACTION_SERIALIZABLE);

Leave a Reply


Warning: Invalid argument supplied for foreach() in /home/content/w/h/i/whibla1/html/wp-content/plugins/smilies-themer-toolbar/smilies-themer-toolbar.php on line 450