InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
SET IDENTITY_INSERT ON y LinqToSQL
SQL Server 2008
LinQ To SQL - Un ejemplo sencillo
Formatear números en SQL Server
Leer un campo XML de SQL Server 2005 con C#
SQL dinámico en Transact SQL
Cursores en Transact SQL
Triggers en Transact SQL
Replicación con SQL Server y SQL Server Mobile
Funciones en Transact SQL

Afiliados
La Web del programador
MundoProgramacion


 

Bloqueos y nivel de aislamiento en SQL Server 2005.

    Bajo mi punto de vista el punto debil de SQL Server siempre fueron los bloqueos. Conscientes de este problema, Microsoft se ha puesto manos a la obra y parece que en SQL Server 2005 han solucionado el problema.

    Para aquellos que no tengan ni idea de que es un bloqueo diremos que un bloqueo se produce cuando un usuario modifica o lee datos en una transacción.

    Por ejemplo, imaginemos que estamos actualizando una "factura" de estado "pendiente" a estado "pagado", durante el tiempo que dura la transacción (antes de hacer COMMIT o ROLLBACK), si otro usuario quiere ver el estado de la "factura" ... ¿que estado mostramos? ¡los datos están cambiando!. Si devolvemos "pendiente" no sería correcto, ya que el estado ha cambiado a "pagado", pero si devolvemos "pagado" tampoco es correcto, ya que la transacción podría hacer ROLLBACK y abriamos efectuado una lectura fantasma. SQL Server bloquea la fila (en el mejor de los casos) e impide el acceso a los datos afectados por la transacción, como consecuentcia el resto de usuarios concurrentes se quedan "bloqueados", sin posibilidad siquiera de leer los datos. Este es solo uno de los escenarios en los que el "bloqueo" hace acto de presencia, pero hay más. 


[Ampliar Imagen]

 
    Para controlar como afectan los bloqueos a las trasnsacciones, podemos modificar el nivel de aislamiento de las transacciones a través de la instrucción SET TRANSACTION ISOLATION LEVEL. Con esta instrucción controlamos como interpreta la transacción los bloqueos existentes y como genera nuevos bloqueos con sus operaciones de lectura/escritura.

    Su sintaxis general es la siguiente:


SET TRANSACTION ISOLATION LEVEL <opcion>

    Donde <opcion> puede tomar estos valores:

  • READ COMMITTED - La transacción no puede leer datos modificados por otras transacciones. Permite a otras transacciones pueden modificar los datos que se han leido. Esta opción es la predeterminada para SQL Server (incluido 2005).
  • READ UNCOMMITTED - La transacción es capaz de leer los datos modificados por otras transacciones pero que aún no han sido confirmadas (pendientes de COMMIT).
  • REPEATABLE READ - La transacción no puede leer datos modificados por otras transacciones y otras transacciones no pueden modificar los datos que se han leido.
  • SERIALIZABLE - Las instrucciones no pueden leer datos que hayan sido modificados, pero aún no confirmados, por otras transacciones y ninguna otra transacción puede modificar los datos leídos por la transacción actual ni insertar filas nuevas con valores de clave que pudieran estar incluidos en el intervalo de claves hasta que la transacción actual finalice.

    En este escenario, cualquiera de las opciones posibles tiene sus inconvenientes, por lo que la gestión de los bloqueos siempre ha sido un tema dificil de solventar en versiones anteriores de SQL Server. En SQL Server 2005 se ha incluido un nuevo nivel de aislamiento, el nivel SNAPSHOT que asegura la coherencia de los datos para toda la transacción:

  • SNAPSHOT - Activa el versionado de fila. Las instrucciones que se ejecuten en la transacción no verán las modificaciones de datos efectuadas por otras transacciones, en su lugar reciben una "copia coherente" de como estaban los datos al comienzo de la transacción. De este modo actuan otros gestores de bases de datos muy populares, como por ejemplo, ORACLE.

    El nivel de aislamiento SNAPSHOT no está disponible de forma predeterminada. Una base de datos con el nivel de aislamiento SNAPSHOT activado requiere de un mayor espacio de almacenamiento.

    Para activar la opción ALLOW_SNAPSHOT_ISOLATION con la siguiente instrucción:


 ALTER DATABASE MyDatabase
 SET ALLOW_SNAPSHOT_ISOLATION ON

    Con esta operación hemos activado el versionado de filas, pero como dijimos antes, por defecto las transacciones funcionan con el nivel de aislamiento READ COMMITTED, lo que obliga a las conexiones a especificar el nivel de aislamiento explicitamente a través de la sentencia SET TRANSACTION ISOLATION LEVEL SNAPSHOT si quieren acceder al versionado de filas. Para solucionar este problema, podemos cambiar el comportamiento de READ COMMITTED, para que se comporte como SNAPSHOT del siguiente modo:



 ALTER DATABASE MyDatabase
 SET READ_COMMITTED_SNAPSHOT ON

    Al establecer la opción READ_COMMITTED_SNAPSHOT, sólo se permite en la base de datos la conexión que ejecuta el comando ALTER DATABASE. No debe haber ninguna otra conexión abierta en la base de datos hasta que ALTER DATABASE haya finalizado. No es necesario que la base de datos esté en modo de usuario único. 
 

 


 Versión para imprimir  Foros de consulta


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

Bloqueos y nivel de aislamiento en SQL Server 2005
Autor: Pedro Herrarte Sánchez
Visitas: 6640 Fecha de publicación: 17/04/2007
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 299 | Comentarios: 0 | Archivo: Articulos
Categorias: ASP.NET|CSS|ASP.NET
Visitas: 137 | Comentarios: 0 | Archivo: Articulos
Categorias: TFS
Visitas: 101 | Comentarios: 5 | Archivo: Articulos
Categorias: TFS
Visitas: 425 | Comentarios: 4 | Archivo: Articulos
Categorias: Transact-SQL|LinQ
Visitas: 1443 | Comentarios: 6 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|ADO.NET
27/09/2008 Navegando ....
Visitas: 238 | Comentarios: 0 | Archivo: Articulos
Categorias: Humor
Visitas: 611 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|WCF
Visitas: 2568 | Comentarios: 4 | Archivo: Articulos
Categorias: C#
Visitas: 462 | Comentarios: 0 | Archivo: Articulos
Categorias: JavaScript|ASP.NET
Visitas: 1071 | Comentarios: 0 | Archivo: Articulos
Categorias: Windows XP|Linux|Windows Vista

Útimos temas recibidos en los foros ...
Cuestión de BFILE. por Megatron ... [ORACLE] 0 21/11/2008
Enviar email por Dol ... [ASP.NET] 5 21/08/2007
*******PREGUNTA********: por T.S.U.En Informatíca ... [Visual Basic 6.0] 5 17/03/2008
Programar tareas en oracle. por Rodrigo ... [ORACLE] 0 21/11/2008
fechas con datatimepicker por peyin ... [Visual Basic .NET] 3 20/11/2008
agregar datos de un gridview a un textbox por jhors ... [ASP.NET] 3 19/09/2007
Select de sql en c# por Stuart ... [C#] 1 20/11/2008
Manual en Español de SQL Navigator for Oracle por Maira ... [ORACLE] 12 30/03/2008
Como mandar mensaje a Celular por Pako ... [C#] 40 13/03/2007
grupo seguridad access 2007 por mithbuster ... [Access] 12 18/05/2007
como insertar datos en una tabla de SQL Server pormedio de codigo en Visual Basic por Pedro ... [SQL Server] 3 07/04/2008
Resolver ejercicio en oracle sqlplus por Andrea ... [ORACLE] 8 06/11/2008

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
01/04/2006 Estructuras de control en PL/SQL    forma parte de...Tutorial PL/SQL
11/09/2006 Trabajar con datos de tipo BLOB en ORACLE
24/07/2006 SQL Dinamico    forma parte de...Tutorial PL/SQL
04/10/2006 Encapsulación    forma parte de...Tutorial C#
14/01/2008 Novedades Visual Studio 2008 DataSet en 3 capas o MVC
04/03/2006 Bloques PL/SQL    forma parte de...Tutorial PL/SQL
21/02/2006 Introducción a .NET
23/05/2006 Cursores en PL/SQL    forma parte de...Tutorial PL/SQL
21/02/2007 Subconsultas    forma parte de...Tutorial SQL
28/07/2007 Drivers y Plugins para conectar mySQL con Visual Studio y .net

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]