Descripción de los niveles de aislamiento
Las transacciones especifican un nivel de aislamiento que define la forma en que una transacción se aísla de las demás transacciones. El aislamiento es la separación de las modificaciones de recursos o datos realizadas por diferentes transacciones. Los niveles de aislamiento se describen para los efectos secundarios de la simultaneidad que se permiten, como las lecturas de datos sucios o las lecturas fantasma.
Los niveles de aislamiento de transacción controlan los efectos siguientes:
Controla si se realizan bloqueos cuando se leen los datos y qué tipos de bloqueos se solicitan.
Duración de los bloqueos de lectura.
Si operaciones de lectura que hacen referencia a filas modificadas por otra transacción:
Se bloquea hasta que se libera el bloqueo exclusivo de la fila.
Recupera la versión confirmada de la fila que existía en el momento en el que se inició la instrucción o la transacción.
Lee la modificación de los datos no confirmada.
Elección de un nivel de aislamiento
La selección de un nivel de aislamiento de transacción no afecta a los bloqueos adquiridos para proteger las modificaciones de datos. Una transacción siempre obtiene un bloqueo exclusivo en los datos que modifica. Mantiene ese bloqueo hasta que se completa la transacción, sea cual sea el nivel de aislamiento establecido para la misma. En el caso de las operaciones de lectura, los niveles de aislamiento de transacción definen principalmente cómo se protege la operación de los efectos de otras transacciones.
Un nivel de aislamiento inferior aumenta la capacidad de muchos usuarios para acceder a los datos al mismo tiempo. Sin embargo, aumenta el número de efectos de la simultaneidad (como las lecturas de datos sucios o las actualizaciones perdidas) que pueden ver los usuarios. Por el contrario, un nivel de aislamiento más elevado reduce los tipos de efectos de la simultaneidad que pueden ver los usuarios. Sin embargo, requiere más recursos del sistema y aumenta la posibilidad de que una transacción bloquee otra. El nivel de aislamiento apropiado depende del equilibrio entre los requisitos de integridad de los datos de la aplicación y la sobrecarga de cada nivel de aislamiento.
El nivel de aislamiento más elevado, serializable, garantiza que una transacción recuperará exactamente los mismos datos cada vez que repita una operación de lectura. Sin embargo, usa un nivel de bloqueo que es probable que afecte a otros usuarios en sistemas de varios usuarios. El nivel de aislamiento menor, de lectura sin confirmar, puede recuperar datos que otras transacciones han modificado pero no confirmado. En este nivel se pueden producir todos los efectos secundarios de la simultaneidad, pero no hay bloqueos ni versiones de lectura, por lo que la sobrecarga se reduce.
Comentarios
En la tabla siguiente se muestran los efectos secundarios de la simultaneidad que permiten los distintos niveles de aislamiento.
Nivel de aislamiento | Lectura de datos sucios | Lectura no repetible | Fantasma |
---|---|---|---|
Lectura no confirmada | Sí | Sí | Sí |
Lectura confirmada | No | Sí | Sí |
Lectura repetible | No | No | Sí |
Instantánea | No | N.º | No |
Serializable | No | N.º | No |
Las transacciones deben ejecutarse en un nivel de aislamiento que sea, como mínimo, de lectura repetible para evitar la pérdida de actualizaciones que puede producirse cuando dos transacciones recuperan la misma fila. A continuación, la transacción actualiza la fila en función de los valores recuperados originalmente. Si las dos transacciones actualizan las filas con una única instrucción UPDATE y no basan la actualización en los valores recuperados previamente, la pérdida de las actualizaciones no puede producirse en el nivel de aislamiento predeterminado de lectura confirmada.
Para establecer el nivel de aislamiento para una transacción, puede utilizar el método de setTransactionIsolation de la clase SQLServerConnection. Este método acepta un valor int como argumento, que se basa en una de las constantes de conexión, según se muestra a continuación:
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
Para utilizar el nuevo nivel de aislamiento de instantánea de SQL Server, puede utilizar una de las constantes SQLServerConnection
:
con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);
o puede utilizar:
con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);
Para obtener más información sobre los niveles de aislamiento de SQL Server, vea "Niveles de aislamiento en Motor de base de datos" en los Libros en pantalla de SQL Server.
Consulte también
Transacciones con el controlador JDBC
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)