Está en la página 1de 14

Unidad 13 / Escenario

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

1 Programación en bases de datos

2 Transacciones y control de concurrencia

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.

Una de las maneras de implementar técnicas de programación en SQL consiste en insertar


instrucciones de consulta SQL en lenguajes como Java o C#. Por otro lado, es posible involucrar
programación procedimental en los sistemas de gestión de bases de datos, lo que hace posible la
automatización de procesos y, además, se simplifica la aplicación de SQL mismo.

Empresas como Oracle han incluido lenguajes procedimentales de programación en PL/SQL,


como: PostgreSQL (Procedural Language / Structured Query Language), PL/pgSQL (Procedural
Language / PostgreSQL Structured Query Language) o Microsoft y SyBase el Transact-sql.

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.

1.1. Comandos SQL incrustados en un lenguaje de programación

En esta metodología se incluye código SQL (lenguaje de datos) embebido en el código de un


lenguaje de programación host (Elmasri & Navathe, 2007, p.252), como Java o C#, por ejemplo.
Para poder integrar el lenguaje de programación con la correspondiente base de datos, conviene
descargar del sitio del fabricante del sistema de gestión de bases de datos, un “conector”. Este no
es más que un programa que, una vez instalado, permite establecer intercambio de información
entre el lenguaje de programación y la base de datos. Adicionalmente, en el código debe incluirse
lo que se denomina una “cadena de conexión”, que es la instrucción que permite establecer la
conexión entre el lenguaje de programación y la base 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 1. Ejemplo de código para conectar Java con PostgreSQL


Fuente: elaboración propia

En el ejemplo anterior, el texto señalado en marrón corresponde a la cadena de conexión. A


continuación, se muestra cómo obtener los datos a partir de una consulta (Figura 2).

String SentenciaSQL = "SELECT * FROM registros"


public static LstRegistros conSelReg(LstRegistros lr, String SentenciaSQL){
try {
Class.forName("org.postgresql.Driver");
try (Connection conexion =
DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydb","postgres", "password")) {
conexion.setAutoCommit(false);
System .out.println("Base de datos abierta exitosamente");
try (Statement declaracion = conexion.createStatement();ResultSet resultado = declaracion.
executeQuery(SentenciaSQL)) {
while(resultado.next()){
int id = resultado.getInt("id ");
String campo = resultado.getString("campo");
Date fecha = resultado.getDate("fecha");
Instancia inst = new Instancia(id, campo, fecha);
lr.addInstancia(inst);
}
resultado.close();
declaracion.close();
}
conexion.close();
System.out.println("Base de datos cerrada 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);
}
return lr;
}

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.

1.2. Uso de funciones y procedimientos almacenados de bases de datos de SQL

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:

• Existe un acceso simultáneo de varias aplicaciones a la misma base de datos.

• Se reduce el uso de recursos y tiempo por evitar la transferencia de datos.

• Se puede mejorar la potencia del modelado de vistas.

A continuación, se presenta de forma genérica, la manera en que se implementan las funciones y


procedimientos almacenados.

1.2.1. Funciones y procedimientos almacenados

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):

CREATE PROCEDURE nombre_procedimiento(parámetros)


declaraciones
cuerpo;

Figura 4.Sintaxis para construcción de procedimientos almacenados


Fuente: elaboración propia

Por otro lado, un formato genérico para declarar una función tiene la siguiente sintaxis (Figura 5):

CREATE FUNCTION nombre_funcion(parámetros)


RETURNS tipo_de_retorno
declaraciones
cuerpo;

Figura 5.Sintaxis para construcción de procedimientos almacenados


Fuente: elaboración propia

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;

Figura 6. Ejemplo de procedimiento almacenado


Fuente: elaboración propia

Para llamar la función se puede emplear, por ejemplo, la siguiente expresión (Figura 7):

SELECT consultar_saldo('043123546')

Figura 7. Ejemplo de llamado a procedimiento almacenado


Fuente: elaboración propia

Esto dará como resultado el saldo de la cuenta identificada como 043123546.

De la misma manera, si se desea hacer un procedimiento similar se podría redactar de la siguiente


manera (Figura 8):

CREATE OR REPLACE PROCEDURE consultar_saldo(no_cuenta NUMBER)


BEGIN
SELECT saldo_cuenta FROM cuenta WHERE id_cuenta = no_cuenta;
END;

Figura 8. Ejemplo de función


Fuente: elaboración propia

Y para llamarlo se puede emplear la siguiente instrucción (Figura 9):

EXEC consultar_saldo('043123546')

Figura 9. Ejemplo de llamado a función


Fuente: elaboración propia

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;

Figura 10. Declaración de cursor


Fuente: elaboración propia

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):

FETCH FORDWARD 5 IN mi_cursor

Figura 11. Llamado de cursor


Fuente: elaboración propia

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.

1.2.3. Disparadores / trigger

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).

CREATE OR REPLACE FUNCTION insertar_trigger_log()


RETURNS TRIGGER AS $insertar$
DECLARE BEGIN
INSERT INTO log( fecha_log, accion ) VALUES(current_
timestamp,'inserción' );
RETURN NULL;
END;
$insertar$ LANGUAGE plpgsql;

CREATE TRIGGER insertar_log AFTER INSERT ON alquileres


EXECUTE PROCEDURE insertar_trigger_log();

Figura 12. Llamado de cursor


Fuente: elaboración propia

2. Transacciones y control de concurrencia


Si bien en las bases de datos se registra y almacena información, para darle una utilidad real a estas es
necesario incluir el concepto de transacción. La transacción se define como:

(…) 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).

Otro concepto de importancia es la concurrencia. Se entiende como concurrencia:

(…) 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

Como se señalaba anteriormente, al hablar de concurrencia nos referimos a la ejecución de procesos


simultáneos en la base de datos. El principal objetivo del control de concurrencia es coordinar los
procesos que se ejecutan sobre los datos de forma simultánea, de tal manera que no se presente
interferencia entre estos. Por esta razón, se debe implementar un modelo que mantenga la
consistencia sobre los datos cuando se presenten transacciones concurrentes.

2.2. Propiedades de transacción ACID

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.

2.2.1. Atomicidad (atomicity)

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.

2.2.2. Consistencia (consistency preservation)

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.

2.2.4. Durabilidad o permanencia (durability)

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.

2.3. Estados de las bases de datos

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.

2.4. Estados de las transacciones

Tabla 1. Operaciones sobre transacciones

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:

Tabla 2. Estados de transacciones

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.

• Permite transacciones simultáneas por parte de distintos usuarios.

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

Microsoft. (2017). Microsoft Developer Network Library. Instrucciones de transacción (Transact-SQL).


Recuperado de https://msdn.microsoft.com/es-es/library/ms174377(v=sql.120).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

Módulo: Fundamentos de bases de datos

Unidad 3: Lenguaje de consulta estructurado-SQL

Escenario 6: Programación de bases de datos.

Autor: Teresa del Pilar Niño Benavides

Asesor Pedagógico: María del Pilar Rivera Acosta

Diseñador Gráfico: David A. Rivera Virgüez

Asistente: Ana Milena Raga Amador

Este material pertenece al Politécnico Grancolombiano.


Prohibida su reproducción total o parcial.

POLITÉCNICO GRANCOLOMBIANO 14

También podría gustarte