Transacciones y bloqueos en SQL-Server



Documentos relacionados
MANUAL DE AYUDA TAREA PROGRAMADA COPIAS DE SEGURIDAD

Programa diseñado y creado por Art-Tronic Promotora Audiovisual, S.L.

AGREGAR UN EQUIPO A UNA RED Y COMPARTIR ARCHIVOS CON WINDOWS 7

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

MANUAL DE AYUDA MODULO TALLAS Y COLORES

Toda base de datos relacional se basa en dos objetos

MÓDULO 3 HERRAMIENTAS EN LA NUBE: ANFIX

MANUAL DE AYUDA MÓDULO GOTELGEST.NET PREVENTA/AUTOVENTA

Con esta nueva versión, si un artículo que está incluido dentro de un Paquete de Ventas tiene precio 0,00, significará gratis.

Sistema de Facturación de Ventas WhitePaper Enero de 2007

Utilidades para el control de stock de los artículos

Una vez que tengamos el padrón de un determinado tributo con todos sus datos actualizados, podemos generar los recibos de ese padrón.

MANUAL SINCRONIZADOR LEKOMMERCE FACTUSOL

NOTAS TÉCNICAS SOBRE EL SIT: Documentos de Gestión

3.1. Guardar un libro de trabajo

Trazabilidad ERP Microsa Gestión de Lotes

GVisualPDA Módulo de Almacén

Manual para la utilización de PrestaShop

MANUAL DE AYUDA. MODULO SAT (Anexo Integración AGIL SAT)

WINDOWS : COPIAS DE SEGURIDAD

GESTINLIB GESTIÓN PARA LIBRERÍAS, PAPELERÍAS Y KIOSCOS DESCRIPCIÓN DEL MÓDULO DE KIOSCOS

Instalar protocolo, cliente o servicio nuevo. Seleccionar ubicación de red. Práctica - Compartir y conectar una carpeta

Software Criptográfico FNMT-RCM

INSTRUCCIONES BÁSICAS DE ACCESO AL PORTAL DEL CLIENTE

Gestión de Retales WhitePaper Noviembre de 2009

PS.Vending Almacén Pocket PC

UAM MANUAL DE EMPRESA. Universidad Autónoma de Madrid

El e-commerce de Grupo JAB es una herramienta que permite a los clientes del Grupo, realizar un amplio conjunto de servicios de consulta, petición y

ADAPTACIÓN PARA LA SUBIDA DE LOS TIPOS DE I.V.A. (Impuesto sobre el Valor Añadido)

PDC Web 2.0. Manuales del usuario Abonos de Lotería

TARIFAS DE VENTA Y DESCUENTOS

- A continuación, se nos abrirá la siguiente ventana pidiendo contraseña, que el cliente haya especificado al instalar Wingest 7

MANUAL COPIAS DE SEGURIDAD

GUIA APLICACIÓN DE SOLICITUDES POR INTERNET. Gestión de Cursos, Certificados de Aptitud Profesional y Tarjetas de Cualificación de Conductores ÍNDICE

ICARO MANUAL DE LA EMPRESA

SISTEMA DE REGISTRO DE TRANSACCIONES BURSATILES BAGSA MANUAL DE USUARIO

MANUAL DE EJECUCION DE LA ESTRATEGIA Ibex35 Evolución por Josep Codina

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

MANUAL DE AYUDA. SAT Móvil (Movilidad del Servicio Técnico)

Guía de uso del Cloud Datacenter de acens

Programa de Ayuda EMCS Instalación Versión SQL Server Versión Marzo 2010

WINDOWS : TERMINAL SERVER

Sistema Integrado de Control de Presencia Dactilar

Recuperador datos externos

Región de Murcia Consejería de Educación, Ciencia e Investigación. Manual Usuario FCT

INVENTARIO INTRODUCCIÓN RESUMEN DE PASOS

Adaptación al NPGC. Introducción. NPGC.doc. Qué cambios hay en el NPGC? Telf.: Fax.:

Internet aula abierta

MANUAL DE CS-ALMACENES

5. Composer: Publicar sus páginas en la web

GedicoPDA: software de preventa

Análisis de los datos

Pulsa en el siguiente enlace para acceder a la página de Favoritos :

INSTALACIÓN El Proceso de Instalación. 2.2 El Asistente de Instalación

Mantenimiento Limpieza

Manual hosting acens

Sincronización del Servidor.

GENERACIÓN DE ANTICIPOS DE CRÉDITO

Departamento CERES Área de Tarjetas Inteligentes Manual de Usuario

Estimado usuario. Tabla de Contenidos

WINDOWS : SERVIDOR DHCP

Plantillas Office. Manual de usuario Versión 1.1

ADMINISTRACIÓN DE USUARIOS

OPERACIONES EN MOSTRADOR

CONSTRUCCIÓN DEL PROCESO TRANSACCIONAL Bizagi Process Modeler

Facturación Automática de Ventas WhitePaper Noviembre de 2006

Por qué Mobility Live?

Cierre y Apertura de ejercicio. Gestión - Contabilidad

GUIA COMPLEMENTARIA PARA EL USUARIO DE AUTOAUDIT. Versión N 02 Fecha: 2011-Febrero Apartado: Archivos Anexos ARCHIVOS ANEXOS

CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO

Servicio de Informática Vicerrectorado de Tecnologías de la Información y la Comunicación

Para añadir un presupuesto nuevo, seleccionaremos en el apartado Presupuestos la opción en la parte superior Añadir.

MANUAL DE USUARIO DE LA HERAMIENTA CONFIGURACION DE PRESUPUESTOS PARA DISTRIBUIDORES

DOCENTES FORMADORES UGEL 03 PRIMARIA

Concurrencia. Bibliografía: Introducción a los Sistemas de Bases de Datos Date, C.J.

COMPRAS CEPAS A TRAVÉS DE INTERNET PORTAL CEPAS

Versión Boletín de Novedades

Hacemos que tu negocio se mueva. Plataforma de ventas movilidapp

Cómo creo las bandejas del Registro de Entrada /Salida y de Gestión de Expedientes?

Manual de operación Tausend Monitor

Resumen. Funcionamiento. Advertencia


MANUAL DE BANCA ELECTRÓNICA

TPVFÁCIL. Caja Real. Definiciones.

Tutorial: Primeros Pasos con Subversion

Herramienta Encuestas. MiAulario

APOLO GESTION INTEGRAL.

Guía Rápida de Inicio

Configuración Avanzada de Transportes e Impuestos en Prestashop. Octubre 2013

Servicio de Informática

Selección de los puntos de montaje

En términos generales, un foro es un espacio de debate donde pueden expresarse ideas o comentarios sobre uno o varios temas.

Compartir Biblio en una red local con Windows XP

Internet Information Server

REDES DE ÁREA LOCAL. APLICACIONES Y SERVICIOS EN WINDOWS

Gestión Básica de SQL Server. Versión V1 Fecha

COPIA SEGURIDAD Y RESTAURACIÓN CURSO

Aplicación informática de Optimización de Facturas Eléctricas (O.F.E)

INDICE. 1. Introducción El panel Entities view El panel grafico Barra de botones Botones de Behavior...

Transcripción:

Transacciones y bloqueos en SQL-Server (Información para el uso desde Axapta) Introducción En este documento vamos a intentar explicar cuatro conceptos básicos acerca de las transacciones y los bloqueos en SQL-Server y lo más importante: como los evita/gestiona Axapta cuando puede. Y cuando no puede algún truquillo para ayudarle. Transacciones Si a mitad de ejecutar un proceso se produce un error, no podemos asegurar la integridad de los datos actualizados por nuestra aplicación. Es decir, si teníamos que actualizar 500 registros de la Base de datos y se ha producido un error cuando habíamos procesado tan solo 200 los otros 300 quedan sin actualizar. En muchos ocasiones esto no es para nada deseable (imaginemos una facturación, se nos produce un error a mitad de procesar los pedidos incluidos en una factura y quedan pedidos marcados como facturados y otros que no y la factura podría no haberse completado). Para evitar este problema existen las transacciones. Una transacción es un sistema que utilizan las BBDD para saber cuando un proceso termina satisfactoriamente. Podríamos decir que es un todo o nada. El tema consiste en que nuestro proceso realiza las actualizaciones que necesita en la base de datos y cuando ha terminado todo el proceso le indica al SQL que todo lo que ha realizado puede darlo por bueno. Por el contrario si hay algún problema, la base de datos dispone de un mecanismo que le permite anular todos los cambios realizados en los datos durante ese proceso. En Axapta, para saber que actualizaciones de la BBDD pertenecen al mismo lote deberemos indicar donde empieza y termina cada transacción: ttsbegin; // principio de la transacción // instrucciones de actualización ttscommit; // final de la transacción

Si no se produce ningún error, se ejecutará la instrucción de fin de transacción y la BBDD guardará las actualizaciones que se han realizado dentro de la transacción. En cambio, si existiese un error se produciría un RollBack que consiste en anular todas las actualizaciones realizadas desde el inicio de la transacción. El famoso RollBack se ejecuta automáticamente en caso de producirse una excepción, pero también podemos ejecutarlo de forma intencionada mediante la instrucción ttsabort. Por supuesto podemos anidar transacciones de manera que se realizará el commit real en la base de datos cuando lleguemos al ttscommit de la transacción de nivel superior. ttsbegin;...... ttsbegin; ttscommit; // Aquí aun no se realiza el commit realmente ttscommit; // Ahora si :) A medida que el interprete de Axapta va encontrando instrucciones ttsbegin va incrementando la variable global ttslevel y por cada ttscommit lo decrementa. Axapta comunica a la base de datos el commit real cuando ttslevel llega a 0. Para los más curiosos tan solo decir que además podéis echar un vistazo a la clase Application, métodos ttsnotifybegin, ttsnotifyabort y ttsnotifycommit. Estas se llaman cada vez que ejecutamos un ttsbegin, ttsabort o ttscommit respectivamente para que Axapta realice una serie de notificaciones a dos sistemas de transacciones especiales de que dispone este ERP. Bloqueos Cuando se esta ejecutando simultáneamente mas de un proceso, a veces sucede que los dos intentan modificar el mismo registro.

Debido al uso de transacciones el sistema puede encontrarse con el problema de que un proceso (A) intenta modificar o leer un registro que ha sido modificado por otro proceso (B) cuya transacción no ha finalizado. El problema está en que podría darse el caso de que esa transacción no terminara de forma satisfactoria (commit) sino que tuvieran que anularse los cambios producidos en ese registro. Que se supone que debería hacer SQL cuando intentamos leer ese registro? Mostrar el valor anterior a la actualización producida por el proceso que está en curso (B)? Mostrar el valor modificado por el proceso (B)? En cualquiera de los 2 casos, y si falla el proceso (B), que valor dejamos en el registro cuando realicemos el rollback? Dejamos el valor anterior a la actualización producida por el proceso (B) a riesgo de que el proceso (A) haya modificado también este registro y machaquemos sus cambios? Imaginemos que se trata de un acumulado (del stock por ejemplo): El stock era 5, el proceso (B) ha restado una unidad y lo ha dejado a 4. El proceso (A) quería restar 2 unidades y basándose en el 4 lo ha dejado a 2. Si falla el proceso (B) y restaura el valor a 5 acabamos de destrozar el acumulado. Para solucionar este problema Sql-Server generará un bloqueo en el momento en que el proceso (B) modifique el registro de manera que el proceso (A) esperará a que (B) termine (bien o mal) para poder continuar. De esta forma nos aseguramos de que el proceso (A) se basará en datos correctos y no pondremos en peligro la consistencia de los mismos. DeadLocks Imaginemos que el proceso (A) bloquea el registro nº1, el proceso (B) bloquea el registro nº2. Ahora el proceso (A) que prosigue su trabajo se dispone a modificar el registro nº2, pero encuentra que esta bloqueado por el proceso (B). A su vez, el proceso (B) (por aquellas cosas del destino y de Murphy) se dispone a proseguir su trabajo pero necesita modificar el registro nº1, que ah! Sorpresa! Está bloqueado por el proceso (A). En resumen : El proceso (A) está esperando a que finalice el proceso (B) para poder modificar el registro nº 2 y el proceso (B) está esperando a que termine el proceso (A) para poder modificar el registro nº1. Estamos frente a lo que se denomina DeadLock o lo que es lo mismo un bloqueo sin solución. Normalmente Sql-Server detectará el problema, elegirá uno de los dos procesos y lo cancelará. A veces no es capaz de detectarlo y se quedan bloqueados hasta que el usuario, el administrador o alguna otra circunstancia cancele uno de los procesos. Una posible solución sería limitar el tiempo de espera para un bloqueo mediante el parámetro de SQL Lock_Timeout. El problema que nos podría ocasionar es que en el

caso que no se tratase de un DeadLock si no de una espera un poco larga pero con final feliz, también generaría un error y cancelaría la transacción. Si nos fijamos, veremos que para evitar que dos procesos tengan que modificar el mismo registro, en Axapta casi no existen acumulados y contadores (secuencias numéricas), y decimos casi porque hay casos en los que no tiene mas remedio que usarlos, pero en estos casos tienen una gestión especial para evitar DeadLocks. Stocks Los stocks de inventario son un caso claro de acumulados. A partir de la Versión 3.0 de Axapta se ha añadido una funcionalidad llamada "transacciones múltiples de Inventario". Cuando está activada en lugar de acumular los movimientos de inventario directamente en el stock (tabla InventSum), los guarda en una tabla como operaciones pendientes de aplicar. Si la transacción termina correctamente realiza la actualización del stock en los acumulados correspondientes. ilustración 1: En el menú Administración, Configurar, Sistema se encuentra esta opción que permite activar o desactivar esta funcionalidad.

Secuencias Numéricas Para evitar los bloqueos, Axapta actualiza los contadores creando una transacción en una conexión independiente, de esta forma no bloquea la secuencia numérica hasta que termina todo el proceso (sería un caos). Por este motivo si una secuencia numérica es de tipo continua (que no debe perder números) el sistema almacena en una tabla a parte una lista de números pendientes de determinar si se han asignado definitivamente o no. Si la transacción finaliza correctamente estos números quedarán marcados como asignados. Escalado de Bloqueos SQL-Server mantiene una lista de los registros que se encuentran bloqueados en cualquier instante por todos los procesos que hay en ejecución. Esto puede consumir bastante memoria. Para evitar el consumo excesivo de memoria, Sql-Server dispone de un mecanismo llamado Escalado de bloqueos. Este consiste en que en un momento determinado, SQL decide que si hay muchos registros bloqueados de una tabla, puede cambiar la lista de referencias a cada uno de esos registros por una sola referencia a nivel de página o bien a nivel de tabla según el caso. Realmente puede ir escalando esta referencia incluso hasta llegar a nivel de Base de datos. Esto supone que puede bloquear toda una página o toda una tabla o toda la base de datos, lo que implica que por ahorrar consumo de memoria puede bloquear registros que no necesitaban ser bloqueados ya que no se han actualizado pero por desgracia se encontraban en una de las páginas que ha decidido

bloquear o en la tabla etc.(hay que señalar que el caso de bloqueo de Base de datos es un caso muy extremo y no suele darse) Este sistema a veces produce resultados indeseados. Por ejemplo en Axapta la tabla de pedidos de venta es común para todas las empresas. Por lo tanto si una de ellas estuviese realizando un proceso de facturación, sería posible que las demás no pudiesen modificar pedidos. Esto puede suceder si se tratan de facturas con muchas líneas, ya que Axapta crea una transacción para cada factura. Para evitar este tipo de bloqueos lo mejor es realizar transacciones pequeñas. Siempre y cuando sea posible (que en muchas ocasiones no lo es). Esto tiene truco Podemos desactivar el escalado de bloqueos en SQL-Server, existe un parámetro para hacerlo. Para introducirlo iremos a las propiedades de Sql-Server, solapa "General", Botón "Parámetros de Inicio", y añadimos el parámetro " T1211". De todas formas debemos ser conscientes de lo que esto supone, estamos privando al servidor de esta funcionalidad, mediante la cual consigue liberar memoria cuando la necesita, lo que podría degradar el rendimiento. Aunque en sistemas con muchos usuarios y transacciones simultaneas puede acabar siendo necesario. También parece ser que es mejor disponer de un índice con clave única para que Sql- Server pueda hacer referencia a los registros bloqueados. Si no es posible definir una clave única, sería buena solución crear un índice por el "RecId".