Introducción
La rapidez y el buen desempeño es una cualidad muy importante en los sistemas computacionales de hoy en día; por ello, los desarrolladores de bases de datos deben consolidar conocimientos teóricos avanzados en el comportamiento de los motores de bases de datos y específicamente en la gestión de transacciones, identificación de bloqueos, monitoreo de errores y solución temprana de los mismos.
Con la presente unidad académica se pretende brindar a los estudiantes fundamentos conceptuales para la gestión de transacciones, identificación de bloqueos y control de concurrencia. También se pretende brindar conocimiento en el manejo de herramientas que permitan realizar el monitoreo del rendimiento y la generación de alertas.
Propósitos de aprendizaje
Propósito general
Propósitos específicos
- Proporcionar al estudiante los fundamentos conceptuales para la gestión de transacciones e identificación de sus estados.
- Dotar al estudiante de bases teóricas sobre la correcta administración, programación y control de la concurrencia.
- Transmitir al estudiante los conocimientos para aprender a identificar los principales problemas de concurrencias y bloqueos.
- Proporcionar al estudiante conocimientos avanzados para la recuperación de errores.
Concepto de transacciones
Un SGBD es transaccional en la medida que puede mantener la integridad de todos los datos, es decir que permite brindar seguridad y consistencia para ejecutar transacciones de principio a fin evitando que alguna de ellas quede en un estado intermedio.
Si existe un caso en donde por algún motivo la transacción se debe cancelar, el motor de base de datos será capaz de deshacer todas las sentencias y transacciones que se hayan realizado hasta ese momento, dejando todos los registros afectados en su estado original, tal como lo muestra el video anterior.
Dentro de este conjunto de actividades, existen transacciones que no dependen de una sola sentencia, sino que por el contrario su éxito está basado en la ejecución de una o varias instrucciones previas, por tanto si alguna de ellas falla, toda la transacción también fallará y finalmente se deben deshacer todos los cambios realizados hasta ese momento. Veamos un modelo de objetos en una transacción.
En PostgreSQL se pueden realizar transacciones utilizando una serie de instrucciones SQL.
![]() |
Ahora estudiemos cómo desarrollar una práctica de una transacción en PostgreSQL. |
Concepto de transacciones
Características ACID
Los SGBD (Sistemas de Gestión de Bases de Datos), entre ellos PostgreSql, están debidamente configurados para que todas sus transacciones manejen el concepto denominado ACID por sus siglas en inglés (Atomicity, Consistency, Isolation y Durability).
Cada característica aporta unas cualidades al aseguramiento de los datos, la consistencia, seguridad y durabilidad de la información a través del tiempo. Cumpliendo estos 4 requisitos un sistema gestor de bases de datos puede ser considerado ACID completamente.
Concepto de Transacciones
Estados de una transacción
Todos los SGBD especifican para las transacciones un rango de aislamiento que determinan el nivel en que se debe separar una transacción del resto de operaciones activas en el motor en ese momento. Lo anterior hace referencia a las acciones simultáneas que permite el motor para realizar las lecturas desfasadas o ficticias de las tuplas de las tablas.
El nivel de aislamiento para una sesión SQL establece el comportamiento de los bloqueos para las instrucciones SQL. Actualmente la literatura define tres niveles de aislamiento para la mayoría de las bases de datos relacionales.
Concepto de transacciones
Niveles de aislamiento
El estándar SQL (Structured Query Language) enumera ciertos niveles de aislamiento, pero no restringe su uso con algún tipo de sentencia de cierre específica.
En la mayoría de los casos, estos niveles de aislamiento estarán conceptualmente ligados al comportamiento de una lectura de una tupla en la base de datos; las lecturas determinarán qué tipo de bloqueo o cambios se podrán ejecutar en un query, dependiendo del nivel de aislamiento que se haya definido previamente.
Por otro lado, si se necesita ejecutar varias instrucciones y todas hacen parte de un mismo proceso, se debe proceder a crear un bloque que necesariamente tendrá que estar enmarcado por las sentencias BEGIN y END, veamos este ejemplo.
Actividad de aprendizaje
![]() |
De acuerdo con lo estudiado hasta este punto, pon a prueba lo aprendido resolviendo el siguiente crucigrama. |
Ejecución concurrente y bloqueos
Un bloqueo es una acción que ejerce el motor de base de datos e impide el acceso a ciertos datos de la base.
La configuración para el control de bloqueos viene por defecto en cada SGBD pero los administradores del sistema pueden modificarlo durante la ejecución dinámica de sentencias SQL.
![]() |
A continuación, se desarrollarán una serie de ejercicios que permitirán al estudiante revisar de forma práctica el manejo de bloqueos. Para el desarrollo de los siguientes ejercicios en Postgresql se debe trabajar con el cliente PGAdmin III, repasemos el proceso. |
Ejecución concurrente y bloqueos
Tipos de bloqueos
PostgreSQL tiene definido varios tipos de bloqueos con el fin de controlar la concurrencia a las tablas y en general a toda la información de la base de datos
El orden de activación de estos bloqueos puede variar dependiendo de la configuración del motor.
![]() |
En el SMBD PostgreSQL existen varios tipos de bloqueos a nivel de tabla. En la interactividad se presenta un ejemplo de cada uno de ellos. Para esto, se utilizará la tabla “productos”, definida en la unidad No. 1. |
Ejecución concurrente y bloqueos
Bloqueos a nivel de filas
Los bloqueos exclusivos sobre una fila se producen automáticamente cuando se actualizan o eliminan sus campos y se mantienen hasta que la transacción termine o se cancele. Para obtener un bloqueo exclusivo sobre una fila se utiliza la sentencia SELECT FOR UPDATE (SENA, 2017).
Los bloqueos compartidos sobre una fila permiten que otras transacciones tengan el mismo tipo de bloqueo sobre la fila, pero impiden que otra transacción pueda obtener bloqueo exclusivo sobre la misma fila hasta que todos los bloqueos compartidos hayan finalizado. Para obtener un bloqueo compartido sobre una fila se utiliza la sentencia SELECT FOR SHARE (SENA, 2017).
![]() |
Estudiemos los ejemplos de cada uno de los bloqueos nombrados en este apartado. |
Ejecución concurrente y bloqueos
Coherencia de datos
Es importante resaltar que el SGBD PostgreSQL al bloquear una fila o tupla de una tabla, no bloquea los datos que existen en ese registro. Lo anterior significa que es posible que el resultado obtenido por una consulta en un SELECT no sea el último dato vigente, ya que puede darse el caso que momentos después de iniciarse esa transacción estos campos pudieran haber sido modificados por otra transacción.
![]() |
Tip: Una buena práctica en PostgreSql para cuando se quiere evitar algún cambio concurrente, es utilizar el motor; activando la opción de lectura compartida. Cuando se aplica un bloqueo en una transacción serializable asegura que ninguna otra transacción pueda modificarla. |
Con el fin de verificar la validez actual del registro y para protegerlo contra otras posibles actualizaciones concurrentes, hay que usar SELECT FOR UPDATE o una instrucción LOCK TABLE apropiado. SELECT FOR UPDATE bloquea sólo las filas devueltas en las actualizaciones simultáneas, mientras el bloqueo de bloqueos de tabla bloquea toda la tabla (Castillo, 2017).
Actividad de aprendizaje
![]() |
Evalúa lo aprendido, relacionando los conceptos principales acerca del Bloqueo. |
Problemas comunes en las transacciones
Postgres mantiene la consistencia de los datos mediante el uso de un modelo de multiversión. Esto significa que, al consultar una base de datos, cada transacción ve una instantánea de los datos (una versión de la base de datos) como lo fue hace algún tiempo, independientemente del estado actual de los datos subyacentes.
Esto protege la transacción de ver datos inconsistentes que podrían ser causados por (otras) actualizaciones concurrentes de transacciones en las mismas filas de datos, proporcionando aislamiento de transacción para cada sesión de base de datos, sin embargo existen algunos problemas que pueden ocurrir durante ciertos procesos, a continuación se describen algunos de ellos.
Problemas comunes en las Transacciones
Control de Concurrencia
En los gestores de bases de datos se encuentra una aplicación llamada “Schedule”, que es el encargado de gestionar el control sobre los accesos concurrentes a las diferente tuplas de las diferentes tablas existentes en la base de datos.
Esta aplicación tiene contacto no solo con la información que está en los discos sino también con la que se encuentra en memoria. Otra de las tareas importantes realizadas por una aplicación “Scheduler” es el manejo de agendas para ordenar las secuencias de ejecución de tareas.
![]() |
A continuación se expone un ejemplo con dos transacciones. |
Problemas comunes en las Transacciones
Serialización con Locks
Para prevenir problemas al momento de ejecutar transacciones en el motor de base de datos, el Sheduler utiliza unos objetos (Tabla lock) para gestionar los acceso y bloqueos a las tablas del motor.
Se dice que una transacción es consistente si:
- Después de bloquear un registro es capaz de liberarlo posteriormente.
- Puede escribir y/o leer un elemento de una tupla al estar activo un bloqueo que no se haya liberado.
Lo anterior también debe ser gestionado por un “Scheduler”
Problemas comunes en las transacciones
Concurrencia en la multiversión
La mayoría de desarrollos se enfrentan a un gran problema a la hora de desarrollar sistemas de información, y este problema está relacionado con la concurrencia y los bloqueos explicados anteriormente. Se debe tener mucho cuidado a la hora de configurar las transacciones para determinar el modo como se manejarán los bloqueos y así evitar bajos desempeños en la aplicación.
A continuación, se ilustran algunos conceptos que son importantes para este análisis.
Actividad de aprendizaje
![]() |
De acuerdo con lo aprendido, resuelve la siguiente actividad, completando la transacción. |
Resumen
Durante la segunda actividad, revisamos todos los conceptos básicos y avanzados sobre la gestión de transacciones, los bloqueos, tipos para el motor de bases de datos PostgreSql. Se realizó un recorrido por los siguientes temas:
- Transacciones
- ACID
- Niveles de aislamiento
- Bloqueos
- Tipos de bloqueos
- Bloqueos a nivel de tabla
- Bloqueos a nivel de fila
- Control de concurrencia
- Concurrencia en la multiversión
Caso de estudio
Evalúa los conceptos aprendidos a través de este caso de estudio acerca de gestión de inventarios.
Bibliografía ()
Referencias Web
- Arambarris, J. (2016). Lenguaje de Consulta Estructurada (SQL). [online]. Disponible en: http://info3sql.blogspot.com.co/2016/04/sql-structured-query-language-es-un.html
- Aguilar, C. (s.f.). 10. Concurrencia. [online] Ict.udlap.mx. Disponible en: http://ict.udlap.mx/people/carlos/is341/bases10.html
- Brito, F. (2012). Propiedades ACID. [online] Basededatosfrancisbrito.blogspot.com.co. Disponible en: http://basededatosfrancisbrito.blogspot.com.co/2012/09/propiedades-acid.html
- Carmenq27.blogspot.com.co. (2013). Implementación. [online] Disponible en: http://carmenq27.blogspot.com.co/p/implementacion_13.html
- Castillo, Y., Guitiérrez, M. and Hernández, C. (s.f.). sabd15N2 - PostgreSQL. [online] Sabd15n2.wikispaces.com. Disponible en: https://sabd15n2.wikispaces.com/PostgreSQL
- Cortez, E. (2013). Transacciones en PostgreSQL. [online] Eacortez.blogspot.com.co. Disponible en: http://eacortez.blogspot.com.co/2013/01/transacciones-en-postgresql.html
- Devjoker.com. (2006). Transacciones con PL/SQL. [online] Disponible en: http://www.devjoker.com/contenidos/articulos/63/Transacciones-con-PLSQL.aspx
- El Conspirador. (s.f.). Serialización de las transacciones y error en JDBC-Java con ORACLE. [online] Disponible en: http://www.elconspirador.com/2014/03/25/serializacion-de-las-transacciones-y-error-en-jdbc-java-con-oracle/
- Es.wikipedia.org. (2014). Multiversion concurrency control. [online] Disponible en: https://es.wikipedia.org/wiki/Multiversion_concurrency_control
- Msdn.microsoft.com. (2008). Fundamentos de la serialización de .NET Framework. [online] Disponible en: https://msdn.microsoft.com/es-es/library/ms233836(v=vs.90).aspx
- Oxford Dictionaries | Español. (s.f.). coherencia | Definición de coherencia en español de Oxford Dictionaries. [online] Disponible en: https://es.oxforddictionaries.com/definicion/coherencia
- Oxford Dictionaries | Español. (s.f.). ANSI | Definición de ANSI en español de Oxford Dictionaries. [online] Disponible en: https://es.oxforddictionaries.com/definicion/ansi
- Packtpub.com. (2008). PostgreSQL's Transaction Model | PACKT Books. [online] Disponible en: https://www.packtpub.com/books/content/postgresqls-transaction-model
- Partlov, P. (2015). PostgreSQL Locking Revealed - Nordeus. [online] Nordeus. Disponible en: http://blog.nordeus.com/dev-ops/postgresql-locking-revealed.htm
- Strappazzon, N. (2012). PostgreSQL - Lección 8 - Manipulando Datos y Transacciones. [online] Es.slideshare.net. Disponible en: https://es.slideshare.net/nicola51980/postgresql-leccin-8-manipulando-datos-y-transacciones
- Technet.microsoft.com. (s.f.). Bloquear el motor de base de datos. [online] Disponible en: https://technet.microsoft.com/es-es/library/ms190615(v=sql.105).aspx
- Technet.microsoft.com. (s.f.). Niveles de aislamiento del motor de base de datos. [online] Disponible en: https://technet.microsoft.com/es-es/library/ms189122(v=sql.105).aspx













