Mejorando la Performance de Sql Server, entendiendo la concurrencia: (Isolation Level)

por Martin Micheletto  17. agosto 2012

Aislamiento es una de las 4 propiedades ACID (Atomicidad, Consistencia, Aislamiento, Durabilidad) aplicables a una base de datos transaccional. El mismo, define como diferentes cambios producidos por una transacción sobre un recurso afectarán en las demás operaciones concurrentes.

A continuación, veremos ejemplos que muestren el comportamiento obtenido al operar con transacciones  concurrentes en SQL SERVER en los siguientes modos de aislamientos:

•READ COMMITED

•READ UNCOMMITED

•SNAPSHOT

 Para ilustrar los ejemplos,  usaremos la tabla “prueba transacciones” la cual se compone de un id (campo clave) y una descripción generada con el siguiente script:
 
CREATE TABLE [dbo].[pruebatransacciones](
[id] [int] NOT NULL,
[descripcion] [nvarchar](250) NULL,
 CONSTRAINT [PK_pruebatransacciones] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO
 
 
1-Explorador de Objetos de SQLSERVER
  

READ COMMITED:

Es el nivel de aislamiento por defecto en SQL SERVER,  una transacción debe esperar que finalice otra si quiere leer un recurso modificado por la primera:

Ejemplo 1:

1. En una nueva instancia de SQL SERVER (instancia 1):

a.Borramos los datos de la tabla de prueba:

        truncate table dbo.pruebatransacciones

b.     Insertamos un valor inicial original:

insert dbo.pruebatransacciones(id,descripcion)

values('1','valor original');


Los datos de la tabla  pruebatransacciones quedarían de la siguente manera:

 


2- Vista parcial en instancia uno.
 

2. El paso siguiente será iniciar una transacción y realizar un update sobre el valor previamente creado (valor original):

begin transaction

update dbo.pruebatransacciones

set descripcion = 'cambio'

 

nota: Estas instrucciones dejarán la transacción abierta a la espera del cierre (commit transaction)

 

3. Luego, desde otra instancia de SQL SERVER (instancia 2):

a. Establecemos el nivel de aislamiento (recordar que es el valor por defecto)

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

b. Luego consultamos la tabla:

select * from dbo.pruebatransacciones

 


3- La consulta no puede terminar.

No es posible obtener los resultados de la tabla, ya que otra transacción ha sido iniciada sobre la misma tabla. Al terminarla en la instancia  1 (solo ejecuto el commit transaction):

 


4- Se ejecuta el commit pendiente de la instancia uno

Inmediatamente, al ver la segunda instancia la consulta realizada ya tendrá sus resultados:

 

5- Al terminar la transacción uno, la instancia dos muestra los resultados

 

READ UNCOMMITED:

También llamado “Lectura sucia”. La segunda transacción puede leer aunque la primera no haya sido completada:

Ejemplo 2:

1. En la instancia 1:

a. Borramos los datos de la tabla de prueba:

truncate table dbo.pruebatransacciones

b. Insertamos un valor inicial original:

insert dbo.pruebatransacciones(id,descripcion)

values('1','valor original');


2. Nuevamente iniciamos una transacción y realizamos un update sobre el valor previamente creado (valor original):

begin transaction

update dbo.pruebatransacciones

set descripcion = 'cambio'

nota: Estas instrucciones dejarán la transacción abierta a la espera del cierre (commit transaction)

 

3. Luego, desde otra instancia de SQL SERVER (instancia 2):

a. Establecemos el nivel de aislamiento a testear:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

b. Luego consultamos la tabla pudiendo ver el cambio parcial realizado en la instancia uno:

select * from dbo.pruebatransacciones
 

  
  6- Se obtiene el valor “parcial” en la instancia dos.

El nombre lectura sucia, se debe a que si la transacción uno realiza un rollback no modificándose el valor, se habrá leído un valor erróneo.
 
SNAPSHOT:
 
En este nivel de aislamiento, los cambios que produce una primera transacción sobre un recurso serán ignorados si se comienza una nueva transacción antes de finalizar la primera. Es decir,  cuando  se leen filas modificadas por otras transacciones, se recupera la versión de la fila que existía cuando empezó la transacción
 
Ejemplo 3:
 
1. En la instancia 1:
 
a. Borramos los datos de la tabla de prueba:
 
truncate table dbo.pruebatransacciones
 
b. Insertamos un valor inicial original:
 
insert dbo.pruebatransacciones(id,descripcion)
values('1','valor original');
 
2. Nuevamente iniciamos una transacción, realizamos un update sobre el valor previamente cargado e insertamos un segundo valor:
 
begin transaction
 
update dbo.pruebatransacciones
set descripcion = 'cambio'
 
insert dbo.pruebatransacciones(id,descripcion)
   values('2','valor cambio');
 
nota: Estas instrucciones dejarán la transacción abierta a la espera del cierre (commit transaction)

 


7- Ejecución de las primeras tres instrucciones.

 
3. Luego, desde otra instancia de SQL SERVER (instancia 2):
 
a. Establecemos el nivel de aislamiento:
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
 
b. Luego consultamos la tabla y obtenemos una foto de la tabla antes de empezar la transacción:
 
select * from dbo.pruebatransacciones
 
 


8- La consulta arroja  el valor  original.

El valor arrojado corresponde al existente en la tabla antes que la consulta de la instancia uno lo modifique. 

Además, si desde la instancia dos se desea una tupla específica, solo se podrá hacerlo en aquellas filas cuyo valor no haya sido modificado por la instancia uno.

Un uso frecuente de este nivel de aislamiento es por ejemplo la situación donde desde una aplicación se desea mostrar una grilla con paginado en base de datos. Todo los pedidos de página responderán a un set de datos inicial consistentes al momento de consultar la grilla por primera vez. 

Tags:

SQL Server | Tecnología

Introduciendo Windows Azure

por fernando  28. junio 2010

La plataforma Windows Azure es una colección de servicios basados en la nube para crear y consumir aplicaciones y servicios en la nube. Los componentes clave de la plataforma son:

WindowsAzurePlataforma

  • Windows Azure – provee computo virtualizado, almacenamiento y gestión para tus aplicaciones basadas en la nube. Microsoft lo define como un sistema operativo en la nube. Provee una abstracción para el hardware repartido en múltiples servidores.
  • SQL Azure – provee servicios de base de datos relacionales basados en la nube.
  • Azure AppFabric – permite que los desarrolladores conecten aplicaciones y servicios en la nube o de forma interna. Esto incluye aplicaciones que se ejecutan en Windows Azure, Windows Server y una cantidad de distintas plataformas, incluso Java, Ruby, PHP, entre otras.

 

Nota: Windows Azure, SQL Azure y Windows Azure platform AppFabric son productos diferentes y su utilización se paga por separado. Para más información click aquí.

La plataforma Windows Azure puede ser utilizada por aplicaciones que corren tanto en un entorno local como desde la nube. Por ejemplo, se puede acceder a datos en la nube desde aplicaciones locales, o una aplicación hosteada en la nube puede acceder a las cuentas de usuarios locales.

 

Windows Azure

 

Windows Azure provee computo y almacenamiento, como también gestión a través del Windows Azure Developer Portal. Los componentes clave son:

  • Servicios de Computo – pedidos de procesamiento. Son instancias de máquinas virtuales (VM) que vienen en dos tipos: Web Roles y Worker Roles. Los Web Roles incluyen Internet Information Services (IIS) y pueden aceptar pedidos HTTP y HTTPS. Worker Roles no vienen configurados con IIS y se utilizan principalmente para procesamiento en segundo plano.
  • Servicios de Almacenamiento – almacena datos. Provee blobs, tables y queues. Blobs (Binary Large Object) y tables son para almacenar y leer datos, pero queues (filas) se usan principalmente para que instancias de Web Roles se comuniquen con instancias Worker Roles en forma asíncrona.
  • Fabric – consiste de un (gran) grupo de máquinas. Todas las máquinas son controladas por el Fabric Controller. El Fabric Controller está encargado de monitorear todas las aplicaciones que están corriendo, gestiona las Windows Azure VMs, y decide en qué servidores correr nuevas aplicaciones, optimizando la utilización del hardware.

 

Al desarrollar una aplicación Windows Azure, la primer gran diferencia que se encuentra es la falta de estados (stateless). No se puede utilizar Session en una aplicación web, por ejemplo. Para guardar estados, debemos recurrir a un blob típicamente. Esto es debido a que Microsoft no garantiza en qué servidor va a estar corriendo nuestra aplicación, y tampoco garantiza que va a seguir corriendo en el servidor en el cual comenzó a correr. En cualquier momento podría caerse el servidor en el cual nuestra aplicación se ejecutaba, y automáticamente otro servidor en el Fabric levantará una VM nueva para correr la aplicación.

Además, al crear un Role (worker o web), se debe crear una clase que herede de RoleEntryPoint. Esta clase contiene 3 métodos importantes:

  • OnStart(): Es llamado por el Fabric al comienzo, y te permite realizar alguna tarea de inicialización.
  • OnStop(): Es llamado cuando el rol es detenido. Te permite realizar cualquier tarea final antes de detenerse el rol. Un rol puede detenerse porque el Fabric decidió cambiarlo de servidor, o fue solicitado desde el portal web manualmente.
  • Run(): La lógica principal va aquí. Puede ser cualquier cosa, normalmente es un loop que nunca termina.

 

Depende de uno decidir nunca hacer return una vez que el rol comenzó a correr, hasta que se indique que debe detenerse. De todas formas, no es necesario manejar el evento de detención, simplemente puede “fallar” sin problemas.

Finalmente, todos los archivos de un proyecto son estáticos (read only). Si se necesita cambiar el contenido de los archivos, se debe utilizar el servicio de almacenamiento (blobs), o si es configuración, en lugar de utilizar el Web.Config, usar los archivos del Service Model (ServiceConfiguration.cscfg), los cuales pueden ser cambiados sin necesidad de re-compilar.

Para más información, ver Windows Azure Platform Whitepapers.

 

SQL Azure

 

SQL Azure provee servicios de bases de datos relacionales en la nube. El principal componente es una SQL Azure Database. Por el momento es el único componente, pero Microsoft promete otros servicios para el futuro.

  • SQL Azure Database – servicio de base de datos relacional basado en Microsoft SQL Server. Una aplicación que utilice SQL Azure ve un entorno familiar al SQL Server, aunque algunos aspectos fueron omitidos en el primer release. Se puede acceder utilizando el protocolo TDS (Tabular Data Stream), lo que significa que se puede utilizar ADO.NET y otras librerías familiares.

 

Ver SQL Azure (MSDN) para más información.

 

AppFabric

 

El objetivo de Windows Azure platform AppFabric (antes denominado “.NET Services”), es proveer un servicio que facilite las conexiones entre aplicaciones que corren en la nube o localmente. Los componentes clave son:

  • Service Bus – facilita realizar conexiones entre aplicaciones a través de internet. Un servicio puede registrar uno o más endpoints con Service Bus. Por cada uno de ellos, Service Bus expone un endpoint, y asigna a la organización una URI raíz. Cuando una aplicación desea conectarse a este servicio, contacta al registro del Service Bus para buscar el endpoint. Service Bus devuelve un documento AtomPub, y el cliente invoca las operaciones expuestas en estos endpoints. Por cada solicitud que Service Bus recibe, invoca a la correspondiente operación en el endpoint expuesto por tu servicio. Además de facilitar la comunicación, Service Bus también puede mejorar la seguridad. Debido a que ahora los clientes ven una IP de Service Bus, no hay necesidad de exponer una dirección IP desde dentro de la organización. Service Bus soporta REST, HTTP y HTTPS.
  • Access Control – provee autenticación y autorización a través de tokens y claims. Actualmente, un cliente se puede identificar utilizando REST. (Microsoft dice que en el futuro ampliará el rol del servicio, agregando soporte para servicios basados en SOAP, etc)

 

Ver AppFabric Service Bus (MSDN) y AppFabric Access Control (MSDN) para más información.

Tags:

Cloud Computing | Tecnología

Manage IT 2010 - Gestión de Proyectos y Arquitectura de Software

por Daniel Laco  26. abril 2010

Se viene el evento nuevamente !!!

 

Este año estaremos repitiendo el evento sobre Gestión de Proyectos y Arquitectura de Software.

VEMN SA conjuntamente con el MUG, Lagash SA y el apoyo de la Universidad Argentina de la Empresa (UADE) realizaremos el evento el día 8 de Junio a las 9.00 hs. en la sala Magna de la UADE.

Temario

8:30 - 9:30 Acreditación
9:30 – 10:00 Presentación del Evento y KeyNote
10:00 – 11:15 Value Express. Optimizando los resultados de sus inversiones realizadas.
(Susana Silberberg)
11:15 - 11:45 Break
11:45 – 13:00 Desarrollo de aplicaciones de misión crítica.
(Diego Gonzalez y Rodolfo Finochietti)
13:00 – 14:15 Almuerzo Libre
14:15 – 15:30 Estimación de Proyectos de Software. La cara oculta de las diferencias.
(Daniel Laco y Patricia Scalzone)
15:30 – 16:00 Break
16:00 – 17:15 ¿Sueñan los Gerentes de IT con programadores eléctricos?
(Luis Ávalo)
17:15 – 17:30 Cierre y Sorteos
Es un evento de interés para profesionales de TI, Gerentes de Sistemas, Líderes de Proyectos, Arquitectos, Analistas y todo aquel interesado en el mundo TI.


El evento es gratuito. Vacantes limitadas, con inscripción previa.

Para mas información en www.manageit.com.ar.


Problemas para compartir archivos? He aquí una herramienta salvadora!

por maxi  22. enero 2010

Hay ocaciones cuando necesitamos compartir rapidamente archivos entre pcs de escritorio, notebooks y/o dispositivos móviles.Ya sea dentro de la red interna o con otro usuario que utiliza internet. Si estamos en una LAN incluso podemos tener problemas de seguridad con firewalls, carpetas compartidas y dependiendo si estamos en un dominio o no, con las cuentas para acceder a estos recursos en la máquina remota. Ni hablar de compartir archivos entre máquinas con distintos sistemas operativos o contra celulares por ejemplo. Si queremos compartir un archivo con un usuario de internet que esta fuera de la LAN tenemos varias alternativas, por ejemplo: FTP, MSN, Google Talk (La versión en inglés permite transferir archivos!), Rapidshare!?. Bueno como todos sabemos puede que el receptor no tenga posibilidades de utilizar ninguna de estas herramientas o podemos tener problemas de lentitud.

 

Encontré esta herramienta muy interesante llamada HFS,  que  permite publicar los archivos deseados generando un link para que el usuario remoto haga una descarga común http. No necesitamos ninguna infraestructura especial, ni IIS, apache, JRE, nada extraño, la herramienta se encarga de hostear el archivo.

 

Se puede descargar de: http://www.rejetto.com/hfs/

 

Espero que les sea útil!

 

 

Tags:

Tecnología

El uso de múltiples monitores incrementa la productividad

por maxi  22. enero 2010

Un estudio realizado por NEC, ATI y la Universidad de Utah concluye que el uso de múltiples monitores incrementa la productividad

 

El Dr. James Anderson, profesor del departamento de Comunicaciones de la Universidad de Utah afirma:

“El estudio revela que los usuarios de pantallas múltiples trabajan más rápido, 

realizan más tareas y con menos errores al editar documentos,

planillas de cálculo y edición de imágenes en comparación a los usuarios de una sola pantalla.”


Los principales resultados del estudio arrojaron que los participantes, utilizando una configuración de múltiples monitores:

  • Fueron 10% más productivos.
  • Disminuyeron sus errores de edición en un 18%.
  • Fueron un 29% más efectivos al realizar sus tareas.
  • Se sintieron un 24% más cómodos al usar esta configuración para realizar su trabajo.
  • En un 39% les fue más fácil mover ya acomodar sus fuentes de información.


El estudio menciona los siguientes beneficios de los puestos de trabajo con múltiples monitores:

  • Permite procesar múltiples fuentes de información en forma simultánea, mover y cambiar su tamaño en una o todas las pantallas disponibles para incrementar la productividad.
  • Puede impactar en el ROI de la empresa si se considera la disminución de los errores en cada puesto de trabajo
  • Puede impactar positivamente en la moral de los trabajadores haciendo que se sientan más cómodos y hábiles para completar sus tareas permitiéndoles una navegación más ágil y un enfoque mayor en sus tareas.
  • Tiene una curva de aprendizaje muy baja.


Aplicaciones inmediatas para el desarrollo de software

Podríamos utilizar una pantalla para tener maximizado nuestro entorno de desarrollo y al mismo tiempo, en la otra pantalla, tener un documento con los requerimientos, buscar en internet con un navegador, hacer consultas sobre la BD, etc. Interesante no?

 

Ahora que está demostrado científicamente tal vez las empresas puedan hacer una buena inversión!

Quien se anima a llenar la F-10? (Chiste interno – solo para entendidos!)

 

Para más detalles se pueden consultar las siguientes fuentes

http://www.necus.com/necus/media/press_releases/template.cfm?DID=1947

http://www.nytimes.com/2006/04/20/technology/20basics.html

http://www.tufuncion.com/dos-monitores

http://www.youtube.com/watch?v=TVVLzaMMqRM


Tags: ,

Tecnología

Acerca de los Autores

Este es el blog del equipo de VEMN SA 
Presentaremos temas que nos parezcan de interés sobre tecnología .NET, Procesos y Metodologías y todo aquello relacionado con el proceso de desarrollo de Software

Month List