PgSQL - Notas de estudio 16: Ver, TRANSACCIÓN y BLOQUEO

Tabla de contenido

Vista

CREAR VISTA (crear vista)

DROP VIEW (eliminar vista)

TRANSACCIÓN

Atributos de transacción

Control de transacciones: COMENZAR, COMMITIR, ROLLBACK

CERRAR

Sintaxis del comando BLOQUEAR

punto muerto

Bloqueo de consulta


Vista

Una Vista es una tabla falsa, nada más que una declaración PostgreSQL almacenada en la base de datos con un nombre asociado.

Una Vista es en realidad una combinación de tablas en forma de una consulta PostgreSQL predefinida.

Una Vista puede contener todas las filas de una tabla o filas seleccionadas de una o más tablas.

Las vistas se pueden crear a partir de una o más tablas, según la consulta PostgreSQL utilizada para crear la vista.

Una Vista es una mesa virtual que permite a los usuarios:

  • Una forma que a un usuario o grupo de usuarios le resulta más natural o intuitiva encontrar datos estructurados.
  • Restringir el acceso a los datos, los usuarios solo pueden ver datos limitados en lugar de la tabla completa.
  • Resuma datos de varias tablas para generar informes.

Las vistas de PostgreSQL son de solo lectura, por lo que es posible que las instrucciones DELETE, INSERT o UPDATE no se ejecuten en la vista. Pero puede crear un disparador en la vista, que se activa cuando intenta ELIMINAR, INSERTAR o ACTUALIZAR la vista. La acción que se debe realizar se define en el contenido del disparador.

CREAR VISTA (crear vista)

Utilice la instrucción CREATE VIEW para crear una vista en PostgreSQL. Las vistas se pueden crear a partir de una tabla, varias tablas u otras vistas.

La sintaxis básica de CREATE VIEW es la siguiente:

CREATE [TEMP | TEMPORARY] VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];

Puede incluir varias tablas en una instrucción SELECT, de forma muy parecida a como lo haría en una consulta SQL SELECT normal.

Si se utiliza la palabra clave opcional TEMP o TEMPORARY , la vista se creará en la base de datos temporal.

DROP VIEW (eliminar vista)

Para eliminar una vista, simplemente use la instrucción DROP VIEW con view_name.

La sintaxis básica de DROP VIEW es la siguiente:

runoobdb=# DROP VIEW view_name;

Ejemplo:

mydb=# select * from company;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  1 | Paul  |  32 | California                                         |  20000 |
  2 | Allen |  25 | Texas                                              |  15000 |
  3 | Teddy |  23 | Norway                                             |  20000 |
  4 | Mark  |  25 | Rich-Mond                                          |  65000 |
  5 | David |  27 | South-Hall                                         |  85000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  9 | James |  44 | Norway                                             |   5000 |
 10 | James |  45 | Texas                                              |   5000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
(10 行记录)

/*下面是一个从 COMPANY 表创建视图的实例。视图只从 COMPANY 表中选取几列:*/
mydb=# CREATE VIEW COMPANY_VIEW AS
mydb-# SELECT ID, NAME, AGE
mydb-# FROM  COMPANY;
CREATE VIEW

/*可以查询 COMPANY_VIEW,与查询实际表的方式类似*/
mydb=# select * from company_view;
 id | name  | age
----+-------+-----
  1 | Paul  |  32
  2 | Allen |  25
  3 | Teddy |  23
  4 | Mark  |  25
  5 | David |  27
  8 | Paul  |  24
  9 | James |  44
 10 | James |  45
  6 | Kim   |  22
  7 | James |  24
(10 行记录)


mydb=# \d
                  关联列表
 架构模式 |     名称     |  类型  |  拥有者
----------+--------------+--------+----------
 public   | company      | 数据表 | postgres
 public   | company1     | 数据表 | postgres
 public   | company2     | 数据表 | postgres
 public   | company_view | 视图   | postgres
 public   | department   | 数据表 | postgres
(5 行记录)

/*删除我们在前面创建的 COMPANY_VIEW 视图*/
mydb=#  drop view company_view;
DROP VIEW

mydb=# \d
                 关联列表
 架构模式 |    名称    |  类型  |  拥有者
----------+------------+--------+----------
 public   | company    | 数据表 | postgres
 public   | company1   | 数据表 | postgres
 public   | company2   | 数据表 | postgres
 public   | department | 数据表 | postgres
(4 行记录)

TRANSACCIÓN

TRANSACTION es una unidad lógica en el proceso de ejecución del sistema de gestión de bases de datos y consta de una secuencia limitada de operaciones de bases de datos.

Una transacción de base de datos generalmente consta de una secuencia de operaciones de lectura/escritura en la base de datos . Tiene los siguientes dos propósitos:

  • Proporciona un método para que la secuencia de operación de la base de datos se recupere de una falla a un estado normal y también proporciona un método para que la base de datos mantenga la coherencia incluso en condiciones anormales.
  • Cuando varias aplicaciones acceden a la base de datos al mismo tiempo, se puede proporcionar un método de aislamiento entre estas aplicaciones para evitar que las operaciones de cada una interfieran entre sí.

Cuando una transacción se envía al sistema de gestión de bases de datos (DBMS), el DBMS debe garantizar que todas las operaciones de la transacción se completen con éxito y que los resultados se guarden permanentemente en la base de datos. Si algunas operaciones de la transacción no se completan con éxito, todas operaciones en la transacción Todas las operaciones deben revertirse al estado anterior a la ejecución de la transacción; al mismo tiempo, la transacción no tiene ningún impacto en la base de datos o la ejecución de otras transacciones, y todas las transacciones parecen ejecutarse de forma independiente.

Atributos de transacción

Las transacciones tienen las siguientes cuatro propiedades estándar, a menudo denominadas con el acrónimo ACID:

  • Atomicidad: la transacción se ejecuta en su conjunto y se ejecutan todas o ninguna de las operaciones en la base de datos contenida en ella.
  • Consistencia: las transacciones deben garantizar que el estado de la base de datos cambie de un estado consistente a otro estado consistente. El significado de estado consistente es que los datos de la base de datos deben satisfacer restricciones de integridad.
  • Aislamiento: cuando se ejecutan varias transacciones al mismo tiempo, la ejecución de una transacción no debería afectar la ejecución de otras transacciones.
  • Durabilidad: las modificaciones a la base de datos realizadas por transacciones comprometidas deben almacenarse permanentemente en la base de datos.

ejemplo:

Si alguien quiere utilizar dinero electrónico para comprar algo por valor de 100 yuanes en una tienda, incluye al menos dos operaciones:

  • La cuenta de la persona se reduce en 100 yuanes.
  • La cuenta de la tienda aumenta en 100 yuanes.

Un sistema de gestión de bases de datos que admita transacciones debe garantizar que las dos operaciones anteriores (la "transacción completa") puedan completarse o cancelarse juntas; de lo contrario, 100 yuanes desaparecerán o aparecerán en vano.

Control de transacciones: COMENZAR, COMMITIR, ROLLBACK

Utilice los siguientes comandos para controlar las transacciones:

  • COMENZAR TRANSACCIÓN: Iniciar una transacción.
  • COMMIT : Confirmación de la transacción, o puede utilizar el comando FINALIZAR TRANSACCIÓN.
  • ROLLBACK : Reversión de transacciones.

Los comandos de control de transacciones solo se usan con INSERTAR, ACTUALIZAR y ELIMINAR. No se pueden utilizar al crear o eliminar una tabla porque estas operaciones se confirman automáticamente en la base de datos.

El comando BEGIN TRANSACTION
        se utiliza para iniciar una transacción;  

        Estas transacciones normalmente continúan hasta que se encuentra el siguiente comando COMMIT o ROLLBACK.

        Sin embargo, la transacción también se revertirá cuando se cierre la base de datos o se produzca un error.

Comando COMUNICAR

        El comando de transacción se utiliza para guardar los cambios llamados por la transacción en la base de datos, es decir, confirmar la transacción.

comando RETROCEDER

        Se utiliza para deshacer comandos de transacción que no se han guardado en la base de datos, es decir, para revertir la transacción.

/*以下是启动一个事务的简单语法:*/
BEGIN;
---或者---
BEGIN TRANSACTION;

/*COMMIT 命令的语法如下:*/
COMMIT;
---或者---
END TRANSACTION;

/*ROLLBACK 命令的语法如下:*/
ROLLBACK;

Ejemplo:

mydb=# select * from company;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  1 | Paul  |  32 | California                                         |  20000 |
  2 | Allen |  25 | Texas                                              |  15000 |
  3 | Teddy |  23 | Norway                                             |  20000 |
  4 | Mark  |  25 | Rich-Mond                                          |  65000 |
  5 | David |  27 | South-Hall                                         |  85000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  9 | James |  44 | Norway                                             |   5000 |
 10 | James |  45 | Texas                                              |   5000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
(10 行记录)

/*开始一个事务,并从表中删除 age = 25 的记录,最后,我们使用 ROLLBACK 命令撤消所有的更改。*/
mydb=# BEGIN;
BEGIN
mydb=# DELETE FROM COMPANY WHERE AGE = 25;
DELETE 2
mydb=# ROLLBACK;
ROLLBACK
mydb=# select * from company;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  1 | Paul  |  32 | California                                         |  20000 |
  2 | Allen |  25 | Texas                                              |  15000 |
  3 | Teddy |  23 | Norway                                             |  20000 |
  4 | Mark  |  25 | Rich-Mond                                          |  65000 |
  5 | David |  27 | South-Hall                                         |  85000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  9 | James |  44 | Norway                                             |   5000 |
 10 | James |  45 | Texas                                              |   5000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
(10 行记录)

/*开始另一个事务,从表中删除 age = 25 的记录,最后我们使用 COMMIT 命令提交所有的更改。*/
mydb=# BEGIN;
BEGIN
mydb=# DELETE FROM COMPANY WHERE AGE = 25;
DELETE 2
mydb=# COMMIT;
COMMIT
mydb=# select * from company;
 id | name  | age |                      address                       | salary | join_date
----+-------+-----+----------------------------------------------------+--------+-----------
  1 | Paul  |  32 | California                                         |  20000 |
  3 | Teddy |  23 | Norway                                             |  20000 |
  5 | David |  27 | South-Hall                                         |  85000 |
  8 | Paul  |  24 | Houston                                            |  20000 |
  9 | James |  44 | Norway                                             |   5000 |
 10 | James |  45 | Texas                                              |   5000 |
  6 | Kim   |  22 |                                                    |        |
  7 | James |  24 |                                                    |        |
(8 行记录)

CERRAR

Los bloqueos se utilizan principalmente para mantener la coherencia de los datos de la base de datos y evitar que los usuarios modifiquen una fila o una tabla completa. Generalmente se utilizan en bases de datos con alta concurrencia.

Cuando varios usuarios acceden a la base de datos, si no se controlan las operaciones simultáneas, se pueden leer y almacenar datos incorrectos, destruyendo la coherencia de la base de datos.

Hay dos tipos básicos de bloqueos en la base de datos: bloqueos exclusivos (Exclusive Locks) y bloqueos compartidos (Share Locks) .

Objeto de datos: si se agrega un bloqueo exclusivo, otras transacciones no pueden leerlo ni modificarlo.

                     Si se agrega un bloqueo compartido, otras transacciones pueden leer el objeto de la base de datos, pero no pueden modificarlo.

Sintaxis del comando BLOQUEAR

/*LOCK 命令基础语法如下:*/
LOCK [ TABLE ]
name
 IN
lock_mode
  • nombre:   
    • El nombre de una tabla existente para bloquear (esquema opcional calificado).
    • Si se especifica justo antes del nombre de la tabla, solo se bloquea esa tabla. Si no se especifica, la tabla y todas sus subtablas (si las hay) están bloqueadas.
  • modo de bloqueo:
    • El modo de bloqueo especifica con qué bloqueo entra en conflicto el bloqueo.
    • Si no se especifica ningún modo de bloqueo, se utiliza el modo exclusivo de acceso más restrictivo.
    • Los valores posibles son:
      • ACCEDER A COMPARTIR, COMPARTIR FILA, FILA EXCLUSIVA, COMPARTIR ACTUALIZACIÓN EXCLUSIVA, COMPARTIR, COMPARTIR FILA EXCLUSIVA, EXCLUSIVA, ACCEDER EXCLUSIVA。

Una vez que se adquiere un candado, el candado se mantiene durante el resto de la transacción actual.

No hay ningún comando para desbloquear la tabla;

El bloqueo siempre se libera al final de la transacción.

punto muerto

Puede ocurrir un punto muerto cuando dos transacciones esperan entre sí para completar sus operaciones.

Aunque PostgreSQL puede detectarlos y finalizarlos con una reversión, los puntos muertos siguen siendo un inconveniente.

Para evitar que su aplicación encuentre este problema, asegúrese de diseñar su aplicación para bloquear objetos en el mismo orden.

Bloqueo de consulta

PostgreSQL proporciona métodos para crear bloqueos con significado definido por la aplicación. Estos se denominan bloqueos de aviso .

Dado que su uso no está obligado por el sistema, depende de la aplicación utilizarlos correctamente.

Los bloqueos de asesoramiento son útiles para estrategias de bloqueo que no se ajustan al modelo MVCC.

Por ejemplo, un uso común de los bloqueos de asesoramiento es simular la estrategia de bloqueo pesimista típica de los sistemas de gestión de datos denominados "archivos planos".

Aunque las banderas almacenadas en una tabla se pueden usar para el mismo propósito, los bloqueos de notificaciones son más rápidos, evitan la sobrecarga de la tabla y el servidor los limpia automáticamente al final de la sesión.

/*将 mydb数据库中的 company1 表锁定为 ACCESS EXCLUSIVE 模式。*/
/*LOCK 语句只在事务模式下工作。*/

mydb=# BEGIN;
BEGIN
mydb=# LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
LOCK TABLE
/*上面的消息指示表被锁定,直到事务结束,并且要完成事务,您必须回滚或提交事务。*/
mydb=# COMMIT;
COMMIT

Supongo que te gusta

Origin blog.csdn.net/qq_41361442/article/details/124865735
Recomendado
Clasificación