Está en la página 1de 30

AA10-Ev2-Manejo de transacciones, bloqueos y control de

concurrencia ejecutando la práctica propuesta.

CESAR YAIR CASTRO MURILLO

EDWIN ALEXANDER SUAREZ

INGRID MILENA PITA LIZARAZO

SERVICIO DE APRENDIZAJE SENA


GESTIÓN Y SEGURIDAD EN BASE DE DATOS
OCTUBRE DE 2017
Contenido
LABORATORIO 10. ............................................................................................................................... 3
Concurrencia y bloqueos en el SMBD Postgre SQL .............
......................
..................
..................
..................
..................
...................
...................
......... 3
Server Estatus. ................................................................................................................................. 3
Creación de transacciones en
e n el SMBD PostgreSQL .................
...........................
...................
..................
..................
..................
.................
........ 5
Deshacer transacciones en el SMBD PostgreSQL...................
...........................
...................
...................
..................
..................
..................
...........
.. 6
Deshacer selectivamente los cambios de una transacción en el SMBD PostgreSQL .................
....................
... 11
Consulta de la información de las transacciones en SMBD PostgreSQL. ...........
....................
..................
..................
......... 13
Gestión de bloqueos ..................................................................................................................... 15
Afinamiento del SMBD PostgreSQL para el
e l control de bloqueos .........................
..................................
..................
...............
...... 15
Calculo del tamaño de la tabla de bloqueos en el SMBD.................
SMBD..........................
..................
..................
..................
..................
......... 17
Bloqueos a nivel de tabla .............................................................................................................. 17
Bloqueos a nivel de fila. ................................................................................................................ 23
JMeter. .......................................................................................................................................... 27
Contenido
LABORATORIO 10. ............................................................................................................................... 3
Concurrencia y bloqueos en el SMBD Postgre SQL .............
......................
..................
..................
..................
..................
...................
...................
......... 3
Server Estatus. ................................................................................................................................. 3
Creación de transacciones en
e n el SMBD PostgreSQL .................
...........................
...................
..................
..................
..................
.................
........ 5
Deshacer transacciones en el SMBD PostgreSQL...................
...........................
...................
...................
..................
..................
..................
...........
.. 6
Deshacer selectivamente los cambios de una transacción en el SMBD PostgreSQL .................
....................
... 11
Consulta de la información de las transacciones en SMBD PostgreSQL. ...........
....................
..................
..................
......... 13
Gestión de bloqueos ..................................................................................................................... 15
Afinamiento del SMBD PostgreSQL para el
e l control de bloqueos .........................
..................................
..................
...............
...... 15
Calculo del tamaño de la tabla de bloqueos en el SMBD.................
SMBD..........................
..................
..................
..................
..................
......... 17
Bloqueos a nivel de tabla .............................................................................................................. 17
Bloqueos a nivel de fila. ................................................................................................................ 23
JMeter. .......................................................................................................................................... 27
LABORATORIO 10.

Concurrencia y bloqueos en el SMBD Postgre SQL

Actividad de Proyecto No. 5: Desarrollar mantenimiento preventivo, correctivo o proactivo para


garantizar niveles de servicio requeridos por la organización.

Server Estatus.
Ingrese al administrador gráfico “pgAdmin3” de PostgreSQL y conéctese a la base
de datos “secsalud”, verifique que esta se encuentra correctamente creada. En el
explorador de objetos de la ventana principal del “pgAdmin3” seleccione la base de
datos de la “secsalud”, posteriormente diríjase
di ríjase al menú “tools” y seleccione la opción
“Server Status”.

La ventana principal de la herramienta “Server Status” está dividida en cuatro


secciones en las
l as que “Locks y Prepared Transactions” suministran información
importante para la administración de bloqueos y transacciones en PostgreSQL.

• La sección “Locks” suministra información sobre los bloqueos que están activos
en PostgreSQL.

• La sección “Prepared Transactions” suministra información sobre las


transacciones activas en PostgreSQL. Minimice la ventana de la herramienta
“Server Estatus”
Estatus” y abra una interfaz para ejecutar sentencias SQL, para ello pulse
el botón que tiene de icono una lupa con la si gla “SQL”.
En la ventana que se carga, seleccione la pestaña “SQL Editor” y escriba la
sentencia que aparece en la siguiente imagen, posteriormente pulse el botón
“Execute query” para ejecutar la sentencia.

BEGIN TRANSACTION;
SELECT * FROM estadopersona WHERE descripcion = 'Cesante' FOR
UPDATE;
UPDATE estadopersona
SET descripcion = 'En Mora'
WHERE descripcion = 'Cesante';
INSERT INTO estadopersona (descripcion) VALUES ('Registrado');
INSERT INTO estadopersona (descripcion) VALUES ('N/R');
COMMIT;

Vuelva a la ventana del “Server Status” y pulse el botón “Refresh” que tiene el
siguiente icono. Inmediatamente se visualizará en la sección “Locks” la información
sobre los bloqueos que ha generado esta sentencia.
Creación de transacciones en el SMBD PostgreSQL

Para crear una transacción se coloca el conjunto de operaciones SQL que


queremos ejecutar como una unidad, dentro de las cláusulas BEGIN
TRANSACTION y COMMIT, la sintaxis es la siguiente: BEGIN TRANSACTION; ...
operación 1 ... operación 2 ... o peración 3 COMMIT; → si las operaciones de la
transacción son consistentes los cambios se confirman.
Para crear una transacción se coloca el conjunto de operaciones SQL que
queremos ejecutar como una unidad, dentro de las cláusulas BEGIN
TRANSACTION y COMMIT, la sintaxis es la siguiente:

Sentencia No.1:
BEGIN TRANSACTION; SELECT * FROM estadopersona WHERE descripcion = ‘Cesante’ FOR
UPDATE; UPDATE estadopersona SET descripcion = ‘En Mora’ WHERE descripcion = ‘Cesante’;
INSERT INTO estadopersona (descripcion) VALUES (‘Registrado’); INSERT INTO estadopersona
(descripcion) VALUES (‘N/R’); COMMIT;

Consulte de nuevo los registros de la tabla ‘estadopersona’ e inmediatamente se


visualizará que todos los cambios que se ordenaban con las operaciones escritas
dentro de la transacción se realizaron correctamente.

Deshacer transacciones en el SMBD PostgreSQL.

Las operaciones que están dentro de una transacción tienen la característica que al
ejecutarse se completan todas o ninguna, para verificar esto realice una consulta
sobre los registros de la tabla “estadoeps” posteriormente ejecute la sentencia de la
siguiente transacción en una ventana del “SQL Editor”:
Sentencia No.2:
BEGIN TRANSACTION;
SELECT * FROM estadoeps WHERE idestadoeps=1 FOR UPDATE;
UPDATE estadoeps
SET descripcion = 'Operando'
WHERE descripcion = 'Activa';
SELECT * FROM estadoeps WHERE idestadoeps=2 FOR UPDATE;
UPDATE estadoeps
SET descripcion = 'Suspendida'
WHERE descripcion = 'Desactivada';
COMMIT;

Se ha realizado la actualización de los registros de la tabla, pero toco eliminar parte


del código por que intenta insertar un dato donde ya existe ese id y no puede por
que presentaría duplicidad de llave
NSERT INTO estadoeps (idestadoeps, descripcion) VALUES (1,'Prueba');
COMMIT;
También para poder hacer las actualizaciones podemos usar ROLLBACK
Deshacer parte de los cambios de una transacción en el SMBD PostgreSQL En
situaciones de concurrencia sobre una o varias tablas es necesario deshacer parte
de los cambios realizados por las operaciones de una transacción, esto es posible
utilizando la sentencia ROLLBACK, la sintaxis es la siguiente: BEGIN
TRANSACTION; ... operación 1 ... operación 2 ROLLBACK; → los cambios de las
operaciones 1 y 2 no serán confirmadas porque causan problemas de consistencia
o conflicto en los objetos que está modificando en la base de datos. ... operación 3
→ los cambios de esta operación se confirmarán en la base de datos COMMIT;

Sentencia No.3:
BEGIN TRANSACTION;
SELECT * FROM estadoeps WHERE idestadoeps=1 FOR UPDATE;
UPDATE estadoeps
SET descripcion = 'Operando'
WHERE descripcion = 'Activa';
INSERT INTO estadoeps (descripcion) VALUES ('N/R');
ROLLBACK;
SELECT * FROM estadoeps WHERE idestadoeps=2 FOR UPDATE;
UPDATE estadoeps
SET descripcion = 'Suspendida'
WHERE descripcion = 'Desactivada';
COMMIT;

Antes de la ejecución del código

Posteriormente realice una consulta sobre la tabla “estadoeps” y observe que las
operaciones UPDATE e INSERT que están antes del ROLLBACK no fueron
confirmadas, mientras que los cambios indicados por la operación UPDATE que
esta después del ROLLBACK fueron escritos correctamente en la tabla.
Después de la ejecución del código
Deshacer selectivamente los cambios de una transacción en el SMBD PostgreSQL

Con la instrucción SAVEPOINT es posible controlar selectivamente los cambios


que producen las operaciones de una transacción, esto debido a que permite
anular operaciones específicas de una transacción cuando sucede un error y
confirmar las que han sido procesadas correctamente, la sintaxis es la siguiente:
BEGIN TRANSACTION; ... operaciones1 SAVEPOINT retorno; ... operaciones2 ROLLBACK TO
retorno; ... operaciones3 COMMIT;

Sentencia No.4:

BEGIN TRANSACTION;
--Agregamos un nuevo servicio
INSERT INTO tiposervicio (descripcion) VALUES ('Oncologia');
--Agregamos una nueva eps y definimos un primer punto de re torno
SAVEPOINT retorno1;
INSERT INTO eps (nombre, estadoeps) VALUES ('SANITAS',1);
--El nombre de la eps ingresada es “COLSANITAS” y no “SANITAS”
esta ya existe en la base de datos, por tanto usamos el
“retorno1” para deshacer la operación INSERT.
ROLLBACK TO retorno1;
--Ingresamos el nombre de la eps como es correcto.
INSERT INTO eps (nombre, estadoeps) VALUES ('COLSANITAS',1);
--Finalmente agregamos el servicio de oncología a las EPS que
lo prestan
INSERT INTO servicioeps VALUES (1,11,'A',300000, 'Unidad de
medicina especializada');
INSERT INTO servicioeps VALUES (4,11,'A',250000, 'Unidad de
medicina especializada');
COMMIT;

Mostremos el estado actual de la tabla:


Ejecutamos el código:
Consulta de la información de las transacciones en SMBD PostgreSQL.

Sentencia No.5:

BEGIN TRANSACTION;
SELECT * FROM estadoeps WHERE idestadoeps=1 FOR UPDATE;
UPDATE estadoeps
SET descripcion = 'En Operacion'
WHERE descripcion = 'Activa';
SAVEPOINT retorno;
INSERT INTO estadoeps (descripcion) VALUES ('N/R');
ROLLBACK TO retorno;
INSERT INTO estadoeps (descripcion) VALUES ('No Registra');
Observe que la transacción no se ha confirmado “sin COMMIT” intencionalmente
para que podamos visualizar sus datos consultado el catalogo del sistema.

Sentencia No.6:
select * from pg_stat_activity psa RIGHT JOIN pg_stat_database psd USING(datid);

Posteriormente en la pestaña “Data Output” identifique la fila que contiene la


información correspondiente a la transacción que acabamos de ejecutar e interprete
los campos y datos arrojados en cada uno de ellos. En la siguiente captura de
pantalla se muestra el resultado de este

procedimiento
Gestión de bloqueos
Afinamiento del SMBD PostgreSQL para el control de bloqueos

El SMBD PosgreSQL proporciona las siguientes funciones de acceso a estadísticas


que permiten establecer información sobre la cantidad de transacciones
completadas y abortadas en el sistema:

• pg_stat_get_db_xact_commit(oid): Cantidad de transacciones completas


(COMMIT)

• pg_stat_get_db_xact_rollback(oid): Cantidad de transacciones abortadas


(ROLLBACK)

 Abra el archivo de configuración “postgres.sql” y modifique los siguientes


parámetros como se indica a continuación, recuerde que estos definen el
comportamiento de los bloqueos en el SMBD PostgreSQL:

 deadlock_timeout: tiempo que el servidor espera para comprobar si hay una


condición de interbloqueo o punto muerto. Defina este parámetro en 800
milisegundos.
 max_locks_per_transaction: indica un valor medio máximo para la cantidad
de bloqueos que admitirá la tabla de bloqueos compartidos. Defina este
parámetro en 32

 max_connections: determina el numero máximo de conexiones concurrentes


al servidor de base de datos. Se encuentra ubicado en la sección
“CONNECTIONS AND AUTHENTICATION”. Establezca este parámetro en
1000 para este laboratorio
 max_prepared_trasaction: establece el numero máximo de transacciones
que pueden prepararse simultáneamente en el SMBD. Se encuentra ubicado
en la sección “RESOURCE USAGE” dentro del archivo “postgres.sql ”. Defina
este parámetro en 5 para este laboratorio

Calculo del tamaño de la tabla de bloqueos en el SMBD

= max_locks_per_transactions * (max_connections + max_prepared_transactions)


= 64 * ( 5 + 1000 ) = 64.320

Cada bloqueo en la tabla de bloqueos ocupa un espacio de 270 bytes de memoria


por lo que debemos realizar la siguiente operación para establecer el tamaño de la
tabla en MB

= 64.320 * 270 bytes

= 17.366.400 bytes / 1024 = 16.959,4 MB

Bloqueos a nivel de tabla

En el SMBD PostgreSQL existen siete tipos de bloqueos a nivel de tabla a


continuación se presenta un ejemplo de cada uno de ellos. Escriba y ejecute en una
ventana del “SQL Editor” cada una de las siguientes sentencias, posteriormente
abra el “Server Status” y verifique el tipo de bloqueo en la sección “Locks”. No olvide
pulsar el botón “Refresh” cada vez que ejecute una nueva sentencia para que
muestre los datos del bloqueo que se generó.
• AccessShareLock: lo adquieren automáticamente las tablas que están   siendo
consultadas y se libera después de que se haya ejecutado la sentencia.

Sentencia No.7
BEGIN TRANSACTION; SELECT * FROM historialpersona;
Sentencia No.8:
BEGIN TRANSACTION; SELECT * from historialpersona WHERE idpersona =
6611537 FOR UPDATE;

Sentencia No.9:
BEGIN TRANSACTION; LOCK TABLE historialpersona IN ROW SHARE MODE;
RowExclusiveLock: lo adquieren las sentencias UPDATE, DELETE, INSERT y
LOCK TABLE para declaraciones IN ROW EXCLUSIVE MODE.

Sentencia No.10:
BEGIN TRANSACTION; UPDATE historialpersona SET estadopersona = 1, ideps
=6 WHERE idpersona = 6611537;

Sentencia No.11:
BEGIN TRANSACTION; LOCK TABLE historialpersona IN ROW EXCLUSIVE
MODE;
Sentencia No.12:
CREATE INDEX indice ON historialpersona (idpersona);

Sentencia No.13:
BEGIN TRANSACTION; LOCK TABLE historialpersona IN SHARE MODE;
Sentencia No.14:
BEGIN TRANSACTION; LOCK TABLE historialpersona IN EXCLUSIVE MODE;

ShareRowExclusiveLock: lo adquieren las sentencias LOCK TABLE para


declaraciones IN SHARE ROW EXCLUSIVE MODE. Presenta conflictos con los
bloqueos RowExclusiveLock, ShareLock, ShareRowExclusiveLock, ExclusiveLock
y AccessExclusiveLock.

Sentencia No.15:
BEGIN TRANSACTION; LOCK TABLE historialpersona IN SHARE ROW
EXCLUSIVE MODE;
 AccessExclusiveLock: lo adquieren las sentencias ALTER TABLE, DROP TABLE,
VACUUM y LOCK TABLE. Presenta conflictos con los bloqueos RowShareLock,
RowExclusiveLock, ShareLock y ShareRowExclusiveLock.

Sentencia No.16:
BEGIN TRANSACTION; ALTER TABLE historialpersona ADD COLUMN estado
VARCHAR(10);

Bloqueos a nivel de fila.

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.

Sentencia No.17:
BEGIN TRANSACTION; SELECT * FROM persona WHERE idpersona=
110763859 FOR UPDATE
Sentencia No.18:
UPDATE persona SET tipoidentificacion = 1 WHERE idpersona = 110763859;

En una nueva ventana de “SQL Editor” ejecute la siguiente sentencia que


comprueba, que los datos de la fila bloqueada se encuentran disponibles solo para
lectura.
Sentencia No.19:
SELECT * FROM persona WHERE idpersona= 110763859;

Sentencia No.19:
BEGIN TRANSACTION; SELECT * FROM persona WHERE idpersona= 110763859
FOR SHARE;
Sentencia No.20:
SELECT * FROM persona WHERE idpersona= 110763859 FOR UPDATE;

Sentencia No.21:
SELECT * FROM persona WHERE idpersona= 110763859 FOR SHARE;
JMeter.
Ingrese al Apache Jmeter y cree un nuevo plan de pruebas que se denomine con
su nombre y apellido “nombre_apellido” y que tenga por comentario “secretaria de
salud”.

Consulta 1:
Listado con el número de identificación, nombre y apellido de las personas, además
del nombre de la EPS y la fecha de ingreso y salida. SELECT p.idpersona,
p.nombre, p.apellido, e.Nombre, h.fechaingreso, h.fecharetiro FROM persona p
INNER JOIN historialpersona h on p.idpersona=h.idpersona INNER JOIN eps e on
e.ideps=h.ideps ORDER BY p.apellido
Consulta 2:
Listado en que se visualiza las EPS con el nombre de los servicios que presta y el
costo de cada uno ellos. BEGIN; SELECT e.nombre, t.descripcion, s.detalle, s.valor
FROM eps e INNER JOIN servicioeps s on e.ideps=s.ideps INNER JOIN
tipoServicio t on s.idtiposervicio=t.idtiposervicio ORDER BY e.nombre COMMIT;
Consulta 3:
Listado con el número de identificación, nombre y apellido de las personas, además
del tipo de afiliación que tiene. BEGIN; SELECT p.idpersona, p.nombre, p.apellido,
t.descripcion FROM persona p INNER JOIN historialpersona h ON
p.idpersona=h.idpersona INNER JOIN tipoafiliado t ON h.tipoafiliado=t.idtipoafiliado
ORDER BY t.descripcion; COMMIT;

También podría gustarte