Estas anomalías se pueden evitar mediante el uso de niveles de aislamiento de transacciones. En los mundos de JavaEE y Spring Framework, hay cuatro niveles de aislamiento de transacciones:
- TRANSACTION_READ_UNCOMMITTED
- TRANSACTION_READ_COMMITTED
- TRANSACTION_REPEATABLE_READ
- TRANSACTION_SERIALIZABLE.
Si usamos READ_UNCOMMITTED, la transacción puede leer datos no confirmados (‘comiteados’). Aquí es donde ocurrirán las Dirty Reads. Si usamos este nivel, pueden ocurrir Dirty Reads, Non-repeatable Reads, y Phantom Reads. Todas las anomalías ocurrirán si usamos este nivel.
El segundo es READ_COMMITTED. Asegura que nuestras transacciones lean solo los datos confirmados (‘comiteados’). Entonces, si usamos este nivel, evitaremos Dirty Reads. Aún así, tendrá el problema de Non-Repeatable reads. Se evitan las Dirty Reads. Todavía pueden ocurrir Non-repeatable Reads y Phantom Reads.
Luego viene REPEATABLE_READ, este es e lnivel más popular y el más usado por defecto. Muchas bases de datos tienen este transaction isolation level como predeterminado. Aquí es donde también podemos prevenir el problema Non-repeatable Read. Pero las Phantom Reads aún pueden ocurrir.
Finalmente, tenemos SERIALIZABLE que es el nivel de aislamiento de transacciones más estricto y también el de menor rendimiento. A medida que aumenta el nivel de aislamiento de la transacción, a medida que cambiamos de Lectura no confirmada a Lectura confirmada y luego a Lectura repetible y Serializable, el rendimiento de nuestra aplicación disminuirá porque nos acercamos a Serializable. Si usamos SERIALIZABLE, eso significa que es casi como si dos transacciones no pudieran acceder al mismo conjunto de datos. Al mismo tiempo, podría ser un bloqueo a nivel de tabla de base de datos. Todas las anomalías serán evitadas. con este nivel.
Dejar un comentario
¿Quieres unirte a la conversación?Siéntete libre de contribuir!