Estancamiento del proceso SQL
En primer lugar, debe configurar su AutoCommit = TRUE. Luego, esto es una cuestión de hábitos de programación. En pb, para el funcionamiento de la ventana de datos, primero configure el método de envío de la ventana de datos. Siempre he
Usar columnas clave, usar
actualizar y luego recordar liberarlo a tiempo después de que se complete cada conexión. Por ejemplo, después de completar la recuperación, recuerde usarlo. resetupdate() para borrar el estado de los datos a tiempo, y luego,
Cada vez que se actualice la base de datos, es decir, después de update(), recuerde usar
ll_num1=.update ()
si ll_num=1 entonces
confirmar;
dw_free.resetupdate()
si no
rollback;
messagebox("¡Pregunta!","¡Error al guardar datos! ")
finalizar si
No estoy de acuerdo con la afirmación anterior:
1. Primero AutoCommit = VERDADERO, y luego ejecute las declaraciones de eliminación, actualización e inserción. Si varias declaraciones SQL se consideran una transacción completa, o la transacción completa se envía o revierte con éxito, el resultado es correcto. no se obtendrá escribiendo esto.
2. En segundo lugar, las columnas clave, use actualización, deben usarse en situaciones específicas. Este formulario tiene la peor concurrencia y es adecuado para ocasiones donde los requisitos de concurrencia de datos no son altos.
3. Hay muchas razones para el estancamiento del programa. Los dos aspectos anteriores son solo algunas de las razones que deben analizarse en detalle, como enviar datos lo antes posible y establecer índices razonables. y una declaración SQ
p>L razonable, evite transacciones cruzadas y las tablas con grandes cantidades de datos deben transferirse a la base de datos histórica de manera oportuna. Creo que los puntos muertos se pueden evitar en gran medida.
Lo anterior es mi humilde opinión, bienvenido a probarlo.
En la consola MSSQL, vaya a Administración-Actividad actual-Bloqueo/ID de proceso para ver qué procesos están bloqueados y luego finalice estos procesos bloqueados en la información del proceso/
Optimice el consulta
También se recomienda verificar: crear un índice en la clave externa. Si está indexado, entonces depurar la red.
Crear un índice en la clave externa puede aliviar este problema. .
Por ejemplo, en el diccionario de productos y la tabla de detalles de ventas, el número de producto en la tabla de detalles de ventas es una clave externa. Si no hay un índice en el número de producto en la tabla de detalles de ventas, se actualiza el producto. El diccionario hará que la tabla de detalles de ventas
Toda la tabla esté bloqueada.
Métodos para resolver el punto muerto de la base de datos Sybase
Liu Zhiming, Departamento de Ciencia y Tecnología, Sucursal Central de Jilin del Banco Popular de China
En el procesamiento de transacciones en línea ( OLTP) sistema de aplicación de base de datos, la concurrencia multiusuario y multitarea es uno de los indicadores técnicos más importantes del sistema. Para mejorar la concurrencia, la mayoría de los RDBMS adoptan actualmente tecnología de bloqueo. Sin embargo, debido a la complejidad del entorno real, el uso de tecnología de bloqueo inevitablemente producirá problemas de punto muerto. Por lo tanto, cómo utilizar la tecnología de bloqueo de manera razonable y eficaz para minimizar el punto muerto es la clave para desarrollar un sistema de procesamiento de transacciones en línea.
Causas de los bloqueos
En los sistemas de procesamiento de transacciones en línea, existen dos razones principales para los bloqueos. Por un lado, debido a los requisitos de integridad de transacciones y concurrencia de múltiples usuarios y tareas múltiples, cuando múltiples transacciones acceden a múltiples recursos al mismo tiempo, si ambas partes han bloqueado algunos recursos pero ambas las necesitan Cuando la otra parte ha bloqueado recursos y no puede Para obtener completamente los recursos requeridos en un tiempo limitado, estará en un estado de espera infinito, lo que provocará un punto muerto en sus requisitos de recursos.
Por otro lado, los métodos de implementación del mecanismo de bloqueo de la base de datos en sí son diferentes y cada sistema de base de datos también producirá su propia situación especial de bloqueo. Por ejemplo, en Sybase SQL Server 11, el bloqueo mínimo es un método de bloqueo de página de 2K en lugar de un bloqueo a nivel de fila.
Si una tabla tiene una pequeña cantidad de registros y una longitud de registro corta (es decir, una alta densidad de registros, como la tabla de configuración del sistema o la tabla de parámetros del sistema en un sistema de aplicación)
, la frecuencia de acceso Si es alto, es fácil provocar un punto muerto en la página.
Varias situaciones de interbloqueo y soluciones
En los sistemas de aplicaciones de liquidación, varias situaciones en las que es probable que se produzcan interbloqueos son las siguientes:
● Diferentes procedimientos almacenados, activadores y los segmentos de declaraciones SQL dinámicas acceden a varias tablas al mismo tiempo en diferentes órdenes
● Agregue una tabla con registros frecuentes durante el intercambio, pero use un índice no agrupado (no agrupado) en la tabla <; /p>
● Hay pocos registros en la tabla y un solo registro es corto, por lo que se accede a él con más frecuencia.
● Se accede con frecuencia a toda la tabla (como la consulta del; tabla de comparación de códigos de espera).
Los métodos de manejo correspondientes para las situaciones de interbloqueo anteriores son los siguientes:
● Durante la implementación del sistema, las operaciones en múltiples tablas en todos los procedimientos almacenados, activadores y segmentos de instrucciones SQL dinámicas deben ser especificado. Utilice siempre el mismo orden. Por ejemplo: hay dos procedimientos almacenados, proc1 y proc2.
Ambos necesitan acceder a tres tablas zltab, z2tab y z3tab. Si se accede a proc1 en el orden de zltab, z2tab y z3tab, entonces también se debe acceder a proc2. accedido en el orden anterior Acceda a estas tres tablas
de forma secuencial.
● Para tablas en las que se agregan registros con frecuencia durante el intercambio, utilice índices agrupados para reducir el riesgo de que varios usuarios agreguen registros a la última página de la tabla, creando puntos calientes al final de la tabla y provocando interbloqueos.
. Este tipo de tabla es principalmente una tabla de flujo de cuentas corrientes. Su característica es que es necesario agregar una gran cantidad de registros al final de la tabla durante el período de intercambio, y se realizan pocas o ninguna operación de eliminación en los registros agregados.
● Para tablas con una pequeña cantidad de registros en una sola tabla y selección o actualización frecuente durante el intercambio, puede usar el método de establecer la fila máxima por página para reducir la densidad de datos almacenados en la tabla. y simular el nivel de fila.
Bloquear para reducir la aparición de interbloqueos en la tabla. Este tipo de tabla es principalmente una tabla con información compleja y una pequeña cantidad de registros.
Por ejemplo: tabla de configuración del sistema o tabla de parámetros del sistema. Agregue la siguiente declaración al definir la tabla:
with max_rows_per_page=1
● En procedimientos almacenados, activadores y segmentos de declaraciones SQL dinámicas, si selecciona operaciones en algunas tablas completas. Si esto Esto sucede con más frecuencia, puede ocurrir un punto muerto en la mesa con otros usuarios accediendo a la mesa. Para declaraciones no críticas, como verificar
si la cuenta existe, pero el campo marcado no se actualizará durante la verificación, puede usar la cláusula at aislamiento lectura no confirmada en el comando de selección
método a resolver. En realidad, este método reduce el nivel de bloqueo de la declaración de selección en toda la tabla y mejora la concurrencia de las operaciones de otros usuarios en la tabla. Este método es particularmente eficaz cuando el sistema funciona con una carga elevada.
Por ejemplo:
seleccionar*de títulos en aislamiento leído sin confirmar
● Para los campos del generador de números de secuencia, como los números de serie, primero puede ejecutar los números de serie de actualización Campo +1 y luego ejecute el método de selección para obtener el número de serie.
Resumen
Cuando el autor realizó una prueba de estrés en el sistema de compensación dentro de la ciudad, probé dos sistemas usando el método de optimización anterior y dos sistemas que no usaban el método de optimización. En las mismas condiciones, la misma cantidad de transacciones y el mismo período de tiempo, el punto muerto ocurrirá de la siguiente manera:
Sistema que utiliza el método de optimización: 0 veces/10,000 transacciones
; Sistemas que no utilizan métodos de optimización: 50 a 200 veces/10.000 transacciones.
Por lo tanto, después de utilizar el método de optimización anterior, el efecto es particularmente significativo cuando el sistema se ejecuta bajo una carga elevada. En resumen, al diseñar y desarrollar sistemas de aplicaciones de bases de datos, especialmente sistemas OLTP, los sistemas deben optimizarse de acuerdo con las condiciones específicas del sistema de aplicación y los principios anteriores, sentando las bases para el desarrollo de un sistema de aplicación eficiente y confiable. .
Experiencia:
1: Problema de front-end: verifique el código para ver si el elemento se ha confirmado o revertido.
2: Problemas de backend: En ocasiones debido a la alta complejidad de los problemas que se procesan. El espacio de registro de la base de datos está lleno o es insuficiente
Como resultado, no se pudo enviar la transacción. SYBAE bajo UNIX es un ejemplo típico. Cada fabricante de bases de datos tiene instrucciones más detalladas para la solución.
Aunque encontré muchos problemas y perdí varios días cambiando de 9 a 10, ahora realmente siento que 10 es mejor que 9.
10. No existe una interfaz dedicada MSSQL y se utiliza la interfaz OLEDB. Al utilizar esta interfaz, se debe prestar atención al problema del punto muerto de la tabla.
Los métodos de conexión mencionados. en Internet hay por todo el mundo una copia grande.
Cuando utilice OLEDB, debe agregar SQLCA.Lock = "RC",
de lo contrario, incluso la consulta quedará bloqueada.
La otra cosa es que el software escrito por 10 ya no será confuso. El software que escribí en chino tradicional no será confuso cuando se ejecute en chino simplificado, y viceversa.
La tercera es que la velocidad de compilación es significativamente más rápida.
La cuarta es que hay un aspecto de estilo XP al compilar, que se siente mucho más hermoso.
Si desea desarrollar buenos hábitos de programación, debe confirmar a tiempo después de la inserción y actualización de la declaración SQL, y debe confirmar a tiempo después de la actualización de la ventana de datos();
El bloqueo se debe a múltiples conflictos de acceso al proceso al mismo recurso. Cuando un proceso accede exclusivamente a un recurso (desde que ingresa a una transacción hasta el final de la transacción), cuando otros procesos necesitan acceder al mismo recurso, provocará el bloqueo (. Según el nivel de bloqueo y la configuración de granularidad);
En aplicaciones reales, el bloqueo puede ocurrir porque la transacción no se envía, la velocidad de la red es demasiado lenta o la consulta de datos de gran capacidad puede causar el bloqueo.
El bloqueo se puede verificar a través del procedimiento almacenado del sistema sp_who. Después de ejecutar sp_who, verifique todos los ID de proceso (SPID) cuyo blk no sea igual a
0 hasta que se encuentre el SPID en el. columna negra, pero actualmente La columna negra de spid=0 significa que es la fuente del bloqueo.
La forma más sencilla es utilizar kill spid (el valor SPID del proceso fuente. Al mismo tiempo, combinado con el proceso sp_lock, puede ver la situación de bloqueo del proceso actual (como el). tipo de bloqueo y el objeto que se está bloqueando)
Lo último y más importante es usar DBCC INPUTBUFFER (spid) para verificar el último contenido enviado después de consultar la fuente, y podrá encontrar el bloqueo causado por el la transacción no se envía (
Generalmente, no se puede usar AutoCommit = Verdadero, porque la mayoría de los programas MIS necesitan usar el envío por lotes para garantizar la finalización de los datos)
/bbs/forumdisplay.php?f =6
Normalmente no lo harás al programar Aviso. En SQLCA (Transacción) por defecto AutoCommit = false (sin confirmación automática). En la misma transacción, si la transacción no se confirma,
puede SELECCIONAR y Recuperar, pero otras transacciones (transacciones en las que aplicaciones en otras computadoras se conectan a la base de datos) no pueden. Esto conduce a un punto muerto que no se puede ver en un entorno de desarrollo independiente.
Debe ejecutar COMMIT o ROLLBACK después de todas las sentencias UPDATE y DELETE SQL, o después de llamar a la función Actualizar de la ventana de datos
Posibles causas y soluciones para los interbloqueos
p>
Por casualidad, vi una publicación sobre interbloqueo (en realidad, bloqueo) en el foro, así que saqué una cosita mía y la compartí con todos. No esperaba que tanta gente. había encontrado esto. p>
Problema.
De hecho, desbloquear no es la solución fundamental. Siento que he engañado a todos un poco, así que tengo el siguiente contenido, espero que todos puedan encontrar la causa raíz según sus propias aplicaciones en lugar de desbloquear. :
Posibles motivos y soluciones para el bloqueo:
1. La transacción no se envía
Esta es la razón más común para el bloqueo, porque PB inicia automáticamente las transacciones. de forma predeterminada, si ejecuta declaraciones de actualización, eliminación o inserción, si no ejecuta Commit, se producirá el bloqueo (
No se recomienda confirmar transacciones automáticamente, por los motivos explicados en la publicación anterior). La solución es simple: busque todos los comandos de modificación de datos (U, I, D) y verifique si se envían normalmente
Simplemente agregue Commit después de encontrarlos
2. SQL SERVER no instala SP3 normalmente
Para usuarios con código normal y aún experimentando bloqueo, deben verificar el parche de su máquina, especialmente si la máquina WIN2003 no instala el parche, 1433 no podrá para monitorear; si el parche no está instalado
Es decir, pero (esta situación me ha perjudicado antes)
Por supuesto, puedes decirme que no hay problema. con el código y el parche instalado. Si aún ocurre, es posible que deba verificar la CPU y el uso de la memoria de su máquina (ejecutando taskmgr), SQL
La máquina del SERVIDOR puede estar bloqueada. estado máximo La solución es pagar: actualizar el servidor;
4. Consultas complejas o consultas de gran capacidad, como utilizar consultas conjuntas de varias tablas en la consulta o utilizar declaraciones como in, not. Esta solución es un poco más compleja y debe personalizarse según sus necesidades. Utilice la aplicación para modificar declaraciones SQL y optimizar la eficiencia de SQL. ...
Eso es todo lo que se me ocurre. Puede que no sea perfecto. ¡Espero que alguien pueda reponerlo!
Es posible que no prestes atención al programar. En SQLCA (Transacción) por defecto AutoCommit = false (sin confirmación automática). En la misma transacción, si la transacción no se envía,
puede SELECCIONAR y Recuperar, pero otras transacciones (transacciones en las que aplicaciones en otras computadoras se conectan a la base de datos) no pueden. Esto conduce a un punto muerto que no se puede ver en un entorno de desarrollo independiente.
Debe ejecutar COMMIT o ROLLBACK después de todas las sentencias UPDATE y DELETE SQL, o después de llamar a la función Actualizar de la ventana de datos
Adicionalmente, además de ejecutar Actualizar y Eliminar, Insertar debe confirmarse a tiempo En SQL Server, se utiliza una base de datos Tempdb. Esta base de datos es compartida por todos los usuarios. Cuando se utilizan funciones estadísticas de SQL como: suma, recuento, etc., SQL Server utilizará automáticamente Tempdb para almacenar estadísticas temporalmente. datos, lo que puede hacer que Tempdb se bloquee fácilmente, por lo que debe confirmar después de leer un procedimiento de almacenamiento muy complejo o crear una tabla temporal, de modo que para liberar recursos de Tempdb, agregar la confirmación en el evento recuperado es una solución, especialmente después de leer el informe. El procedimiento de almacenamiento del informe general es relativamente complicado y el cursor SQL está incrustado en el programa. Después de leer los datos, también es necesario agregar el compromiso. Lo intenté y me tomó mucho tiempo encontrarlo. fuera.