Transacciones y bloqueos de Postgresql

Uno: Asuntos:

Todos sabemos que una transacción es una unidad lógica en un sistema de gestión de bases de datos, compuesta por una secuencia limitada de operaciones, y la más famosa son sus atributos ACID 4.

  • Atomicidad, todas las operaciones contenidas en la transacción se ejecutan o no todas.

  • Coherencia, los datos de la base de datos deben satisfacer las restricciones de integridad.

  • Aislamiento, la ejecución de una transacción en la base de datos no debería afectar a otras transacciones.

  • La durabilidad, la transacción comprometida (estado), su modificación a la base de datos, etc. deben almacenarse permanentemente en la base de datos.


Uso de transacciones

1) Al inicio de la transacción, hay dos formas de escribir:

1) COMIENZO; 
2) COMENZAR LA TRANSACCIÓN;

2) La transacción finaliza, hay dos situaciones:

1) COMMIT; -confirma la transacción 
2) ROLLBACK; -roll la transacción


Para los analistas de pruebas, el concepto de transacción también se puede aplicar a problemas de análisis. Por ejemplo, si desea analizar el plan de ejecución de una declaración SQL de actualización / inserción / eliminación, puede utilizar el concepto de transacción para administrar mejor los datos de nuestra base de datos.


Queremos analizar el plan de ejecución del siguiente SQL:

eliminar del público. "Departamento" donde "DepID" = '1';

Entonces se puede ejecutar de la siguiente manera:

empezar; 
explicar analizar eliminar de público. "Departamento" donde "DepID" = '1';

El plan de ejecución de la declaración SQL de eliminación se obtiene arriba, pero no desea eliminar realmente los datos, puede continuar ejecutando la siguiente declaración:

Retroceder;

Dos: bloqueo

El concepto de bloqueo en Postgresql es consistente con la mayoría de las bases de datos relacionales y es para cumplir con el propósito de la coherencia de los datos en las transacciones. Generalmente, en una base de datos con alta concurrencia, si no se controla, la lectura y el almacenamiento de datos pueden ser inconsistentes.


1) Punto muerto. Si dos transacciones están esperando que la otra complete la transacción, entonces es muy probable que ocurra un punto muerto. Cuando ocurre un punto muerto, postgresql las detectará automáticamente y revertirá todas las transacciones relacionadas para finalizarlas. Asegurarse de que el programa bloquee los objetos en el mismo orden puede evitar de forma eficaz los interbloqueos.

2) En segundo lugar, la división de tipos de bloqueo se puede dividir en bloqueos a nivel de tabla y bloqueos a nivel de fila. Los dos bloqueos más comunes son los bloqueos Compartir y Exclusivo. Compartir se refiere al bloqueo de lectura, es decir, el contenido de la tabla no se puede modificar. Este bloqueo se puede agregar a varias transacciones, pero si alguna transacción no libera el bloqueo, el contenido de la tabla no se puede modificar; el exclusivo es a nivel de tabla El bloqueo de escritura está bloqueado. Si la transacción que adquirió el bloqueo no se libera, otras transacciones no pueden leer ni escribir. Por supuesto, posteriormente se introdujo un mecanismo de múltiples versiones (MVCC) Esta situación se ha mejorado, con 2 bloqueos más, Access Share / Access Exclusive. La operación de la base de datos correspondiente a Access Share generalmente es una instrucción de operación select; la operación de la base de datos correspondiente a Access Exclusive es generalmente alterar tabla / eliminar tabla / truncar / reindexar / vacío completo, etc.


La mejor manera de evitar la contención de recursos y otros problemas se puede evitar razonablemente considerando los siguientes aspectos.

1) Al procesar algunos recursos compartidos con alta simultaneidad, puede considerar cambiar el foco de esta presión de las bases de datos relacionales a las bases de datos NO-SQL en memoria, como redis. El front-end puede considerar la realización de requisitos comerciales como el multihilo y la alta concurrencia, mientras que el back-end clave puede usar el modo de procesamiento nativo de un solo hilo que viene con redis, y su eficiencia de ejecución no es necesariamente mala.

2) Utilice los recursos en el mismo orden en todas las transacciones de la base de datos.

3) Intente utilizar un nivel de aislamiento más bajo.


También puede escanear y seguir la cuenta oficial de WeChat para obtener más contenido relacionado con el rendimiento:

qrcode_for_gh_39009e949117_258-1.jpg


Supongo que te gusta

Origin blog.51cto.com/13734261/2540530
Recomendado
Clasificación