Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Escenario 62
fundamental
Lectura Fundamental
Programación de bases
Etapas de un plan de datos,
de comunicación
transacciones,
estratégica concurrencia y
recuperación
Contenido
Palabras clave: SQL, función, procedimiento almacenado, cursor, disparador, transacción, concurrencia.
1. Programación en bases de datos
Si bien, el SQL es un lenguaje de alto nivel, no es uno que esté orientado a la programación
como tal, sino más bien, como su nombre lo dice, está orientado a la consulta. Sin embargo, los
procesos involucrados en SQL, al ser programados, incrementan el potencial del uso de las bases
de datos involucradas.
En general, los sistemas de gestión de bases de datos no se emplean de manera aislada, sino que
están integrados a otro tipo de aplicaciones o a lenguajes de programación. Estos, a su vez, están
incorporados con sistemas de acceso al usuario, sea en escritorio o en la web. Por esta razón, de
acuerdo con Elmasri y Navathe (2007, p.252), podemos identificar algunas metodologías para la
programación de bases de datos.
A continuación, en la Figura 1 se presentan algunos ejemplos de código para integrar Java con
PostgreSQL. La integración entre otros lenguajes y sistemas de gestión de bases de datos se dejan al
estudiante como investigación.
POLITÉCNICO GRANCOLOMBIANO 2
public static void conectar(){
try {
Class.forName("org.postgresql.Driver");
Connection conexion = DriverManager.getConnection("jdbc:postgresql://
localhost:5432/mydb","postgres", "password");
conexion.setAutoCommit(false);
System .out.println("Base de datos abierta exitosamente");
}
catch (ClassNotFoundException | SQLException e) {
System.out.println("La base de datos no pudo conectarse");
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
}
Figura 2. Ejemplo de código para realizar consulta desde Java conectado con PostgreSQL
Fuente: elaboración propia
POLITÉCNICO GRANCOLOMBIANO 3
En el ejemplo anterior se incluyó, como parámetro, una lista de registros y la sentencia SQL que, una
vez ejecutada, permite recuperar de la base de datos una serie de registros que quedan almacenados
en la variable “resultado”. Luego, los valores almacenados en cada registro son guardados en variables
que, a su vez, permite crear una instancia del objeto equivalente al registro, para ser agregado a la lista
que será retornada al final de la función.
También, se pueden ejecutar otras sentencias SQL como INSERT, UPDATE o DELETE, a través de
códigos como el que se presenta a continuación en la Figura 3.
public static void operacionSQL(String valor){
try {
Class.forName("org.postgresql.Driver");
try (Connection conexion = DriverManager.getConnection("jdbc:postgresql://
localhost:5432/mydb","postgres", "password")) {
conexion.setAutoCommit(false);
Statement declaracion = null;
declaracion = conexion.createStatement();
String SentenciaSQL = "INSERT INTO registros(nombre) VALUES('" +valor+
"');";
declaracion.executeUpdate(SentenciaSQL);
declaracion.close();
conexion.commit();
conexion.close();
}
}
catch (ClassNotFoundException | SQLException e) {
System.out.println("La base de datos no pudo conectarse");
System.err.println(e.getClass().getName() + ": " + e.getMessage());
System.exit(0);
}
Figura 3. Ejemplo de código para insertar en una tabla de una base de datos desde Java conectado con PostgreSQL
Fuente: elaboración propia
En el ejemplo anterior se incluye la sentencia SQL en el código, para hacer modificaciones sobre la
base de datos. Los aspectos propios del lenguaje de programación se dejan al análisis por parte del
estudiante, por estar fuera del alcance del curso.
Como se indicaba en el apartado anterior, en muchas ocasiones las operaciones que se realizan
sobre SQL, se hacen desde un lenguaje de programación con el que se ha establecido una conexión.
POLITÉCNICO GRANCOLOMBIANO 4
Sin embargo, a veces es útil implementar módulos de programa de bases de datos que, valga la
redundancia, son ejecutados en el servidor de bases de datos. Las funciones y procedimientos
son útiles si:
Tanto la función como el procedimiento —dados o no unos parámetros— ejecutan una serie de
operaciones o transformaciones en los datos. Un procedimiento se distingue de una función en
cuanto la función puede retornar un valor, mientras que el procedimiento no lo hace. Un formato
genérico para la declaración de procedimientos es el siguiente (Figura 4) (Elmasri & Navathe,
2007, p.272):
Por otro lado, un formato genérico para declarar una función tiene la siguiente sintaxis (Figura 5):
Así, por ejemplo, crearemos una función para obtener el saldo de una cuenta dato el identificador de la
misma (Figura 6).
POLITÉCNICO GRANCOLOMBIANO 5
CREATE OR REPLACE FUNCTION consultar_saldo(no_cuenta NUMBER)
RETURNS decimal(12,2)
BEGIN
DECLARE saldo decimal(12,2)
SELECT saldo_cuenta INTO saldo FROM cuenta WHERE id_cuenta = no_cuenta;
RETURN saldo;
END;
Para llamar la función se puede emplear, por ejemplo, la siguiente expresión (Figura 7):
SELECT consultar_saldo('043123546')
EXEC consultar_saldo('043123546')
Cada SGBD tiene matices en la sintaxis que deben ser consultados en la documentación puesta a
disposición de cada fabricante.
POLITÉCNICO GRANCOLOMBIANO 6
1.2.2. Cursores
Un cursor es una herramienta que permite que, en lugar de ejecutar una consulta completa a la vez,
sea posible establecer la consulta y, a continuación, leer del resultado de esta un número determinado
de filas a la vez. Entre las razones por las que puede ser conveniente el uso de cursores, tenemos el
emplear la memoria de tal forma que no se ocupe con un gran número de filas. A continuación, en la
Figura 10 vemos cómo se declara un cursor.
BEGIN WORK;
DECLARE mi_cursor CURSOR
FOR SELECT campos FROM tabla;
En general, se emplea la instrucción FETCH para seleccionar la fila que toma el cursor,
FORDWARD la siguiente y BACKWARD la anterior. Por ejemplo, si se desea seleccionar las 5
primeras filas de una consulta se puede indicar de la siguiente manera (Figura 11):
De la misma forma, en cada SGBD la escritura de instrucciones tiene matices que deben ser
consultados en la documentación suministrada por el fabricante.
Los disparadores o triggers son acciones definidas sobre la base de datos, de tal forma que está será
activada antes o después de que se realice alguna operación sobre una tabla, tal como un INSERT,
DELETE o UPDATE, cuando sea llamada por un comando SQL o cuando se ejecute una línea
afectada por comandos SQL.
POLITÉCNICO GRANCOLOMBIANO 7
A continuación, se presenta un ejemplo de trigger empleado para registrar cuando un usuario ha
realizado una inserción de un dato en una tabla (Figura 12).
(…) una unidad única de trabajo. Si una transacción tiene éxito, todas las modificaciones de los
datos realizadas durante la transacción se confirman y se convierten en una parte permanente
de la base de datos. Si una transacción encuentra errores y debe cancelarse o revertirse, se
borran todas las modificaciones de los datos (Microsoft, 2017).
(…) la capacidad de múltiples procesos para acceder o cambiar datos compartidos al mismo
tiempo. Cuanto mayor es el número de procesos de usuario simultáneos que pueden
ejecutarse sin bloquearse entre sí, mayor es la capacidad concurrencia del sistema de base de
datos (Microsoft, 2005).
En la práctica, las bases de datos están siendo afectadas continuamente por procesos transaccionales,
muchas veces concurrentes, los cuales se originan en los usuarios o en los mismos procesos del
sistema. Sin embargo, en caso de existir problemas en alguna transacción es posible que se produzcan
inconsistencias en los datos, que pueden conllevar a errores en la información, problemas para el
usuario o para el propietario del sistema, costos por servicio e, inclusive, problemas legales. De allí la
importancia del control de concurrencia.
POLITÉCNICO GRANCOLOMBIANO 8
2.1. Control de concurrencia
En los momentos en que se presentan transacciones concurrentes sobre las bases de datos, se
deben cumplir las propiedades ACID. Esta denominación es dada por las iniciales en inglés de las
propiedades involucradas.
Esta propiedad entiende a cada transacción como una unidad completa. Es decir, todas las acciones
o procesos involucrados en la transacción se llevan a cabo cuando esta es ejecutada o, por el
contrario, no hay ninguna acción o proceso. En caso de que exista alguna interrupción en los procesos
o acciones involucrados en la transacción, estos serán reversados o anulados, y la base de datos
regresará al estado anterior a la ejecución de la transacción.
Los datos, en toda la base de datos, deben ser siempre consistentes entre sí. No debe haber
referencias a datos que no existan o que contengan información errónea. Así, en toda transacción,
la base de datos debe partir de un estado consistente y terminar en otro estado consistente, para
mantener la integridad referencial.
POLITÉCNICO GRANCOLOMBIANO 9
2.2.3. Aislamiento (isolation)
Supongamos que diversos usuarios estén tratando de acceder y modificar simultáneamente los mismos
datos; esto puede generar inconsistencias entre los datos almacenados. Por esa razón, los datos
involucrados en una transacción no pueden ser empleados por otra transacción hasta que la primera
haya terminado.
Implica que, una vez se confirme que ha concluido exitosamente una transacción en una base de datos,
esta pasa a un estado de consistencia de los datos. Esto con el objetivo de que, incluso si el sistema falla,
los datos se mantengan de forma permanente hasta que puedan llegar a ser modificados por una nueva
transacción.
La base de datos puede estar en dos estados: de consistencia y de inconsistencia. Por lo general, antes
de iniciar la transacción, la base de datos se encuentra en estado de consistencia (debe estarlo). Una
vez inicia la transacción, al involucrar esta con un conjunto de acciones, operaciones o procesos, es
posible que la base de datos entre en un estado temporal de inconsistencia. No obstante, al final de la
transacción, la base de datos debe regresar a un estado de consistencia.
OPERACIÓN DEFINICIÓN
READ En la transacción se está leyendo algún elemento de la base de datos.
WRITE En la transacción se está escribiendo sobre algún elemento de la base de datos.
POLITÉCNICO GRANCOLOMBIANO 10
OPERACIÓN DEFINICIÓN
En la transacción se confirma que las modificaciones hechas deben ser
COMMIT permanentes.
En la transacción se confirma que ninguna de las modificaciones hechas debe ser
ABORT permanente.
Fuente: elaboración propia
La Tabla 1 presenta las operaciones que pueden ser aplicadas en una transacción:
OPERACIÓN DEFINICIÓN
La transacción se está ejecutando.
ACTIVA
PARCIALMENTE Se confirma que la última operación de la transacción fue ejecutada.
CONFIRMADA
CONFIRMADA Se confirma que la transacción fue ejecutada correctamente en su totalidad.
Se presentó algún problema durante la ejecución y la base de datos debe restaurar
FALLA su estado al anterior de la ejecución de la transacción.
COMPLETADA Se ha terminado la transacción.
Fuente: elaboración propia
La Tabla 2 muestra los estados en los cuales se puede encontrar una transacción:
Para facilitar el trabajo con transacciones sobre la base de datos, se emplea el denominado manejador
de transacciones. Este es una aplicación que permite administrar las transacciones que se presentan
en la base de datos y facilitar la implementación de ACID.
2.5. Bloqueos
El sistema puede detener temporalmente la ejecución de transacciones, mientras realiza alguna otra
operación. El objetivo de los bloqueos es evitar conflictos, que sean resultado de la actualización,
ocurridos por la lectura o modificación de datos por parte de los usuarios. Los bloqueos se
caracterizan por:
POLITÉCNICO GRANCOLOMBIANO 11
• Aplicar la serialización en las transacciones. Solo un usuario puede modificar un dato a la vez.
Como se puede evidenciar, ayuda a mantener propiedades tales como el aislamiento. En general,
podemos encontrar bloqueos exclusivos o bloqueos compartidos. Se entiende que un bloqueo es
exclusivo cuando este es solicitado por un único recurso para una transacción; mientras el bloqueo es
compartido cuando se aplica sobre un recurso al que desean acceder varias transacciones.
POLITÉCNICO GRANCOLOMBIANO 12
Referencias
Elmasri, R. & Navathe, S. (2007). Funamentos de Sistemas de Bases de Datos. Madrid: Pearson,
Addison Wesley.
Microsoft. (30 de abril de 2005). Microsoft TechNet. Concurrencia de base de datos y versión de
nivel de fila en SQL Server. Recuperado de https://technet.microsoft.com/en-us/library/cc917674.
aspx
Date, C. (2001). Introducción a los sistemas de bases de datos. Naucalpan de Juárez, México: Pearson
Education.
POLITÉCNICO GRANCOLOMBIANO 13
INFORMACIÓN TÉCNICA
POLITÉCNICO GRANCOLOMBIANO 14