Shanghai Tengke Education Dameng Data Training Productos secos Compartiendo Dameng 6.0 Concurrencia y mecanismo de bloqueo

Acerca del autor: Yang Tingkun (nombre de pantalla Yangtingkun), actualmente director de Administración de Empresas de Haihong Pharmaceutical E-commerce Co., Ltd., y moderador de gestión de bases de datos Oracle del Foro ITPUB. En 2004, participó en la compilación del libro "Oracle Database Performance Optimization". En 2007, Oracle le otorgó el título de Oracle ACE. Le gusta estudiar cuestiones técnicas relacionadas con Oracle. Ha acumulado más de 1.500 artículos técnicos originales relacionados con Oracle en su blog técnico.


  Hace unos días, el editor en jefe Xiong Jianguo de ITPUB se puso en contacto conmigo con la esperanza de que pudiera participar en las actividades aplicables a la base de datos nacional Dameng y escribir algunos artículos sobre su uso. Ha habido muchas cosas manuales recientemente, y planeé rechazarlas, pero el editor Xiong ha invitado y enfatizado repetidamente que no es un artículo de pistoleros, siempre que escriba la experiencia real. En este caso, escribiré algunas experiencias de prueba basadas en el principio de soporte de bases de datos nacionales.


  Dado que la única base de datos con la que estoy familiarizado es Oracle, todas las comparaciones se realizan con la base de datos Oracle. En este proceso, haré todo lo posible para evitar atraer el amor por la base de datos Oracle y me esforzaré por estar en una posición justa. Haz una evaluación.

  Este artículo presenta brevemente el mecanismo de bloqueo y el control de concurrencia de la base de datos Dameng.


  El mecanismo de bloqueo de Dameng es diferente al de Oracle. En comparación con otras bases de datos, la característica más destacada de Oracle es la realización de bloqueos. Por un lado, es un bloqueo de nivel de fila, y el bloqueo no es un recurso, sino que ocupa muy poco espacio de almacenamiento; Oracle no tiene un bloqueo de lectura. La lectura no bloquea la escritura y la escritura no bloquea la lectura. Incluso DB2, SQLSERVER y otras bases de datos no pueden hacer esto, obviamente, no se puede requerir que Dameng cumpla con tales estándares.


  Eche un vistazo a la realización de la cerradura de Dameng:


SQL> CREAR TABLA T
2 (NÚMERO DE ID,
3 NOMBRE VARCHAR (30),
4 NÚMERO DE EDAD);
CREAR TABLA T
(NÚMERO
DE ID, NOMBRE VARCHAR (30),
NÚMERO DE EDAD);
tiempo utilizado: 45,975 (ms) tic del reloj: 76680990.
SQL> INSERTAR EN T
2 VALORES (1, 'A', 10);
INSERT INTO T
VALUES (1, 'A', 10)
1 filas
tiempo afectado utilizado: 0.473 (ms) tic del reloj: 770450.
SQL> INSERTAR EN T
2 VALORES (2, 'B', 20);
INSERT INTO T
VALUES (2, 'B', 20)
1 filas
tiempo afectado utilizado: 0,423 (ms) tic del reloj: 698510.
SQL> INSERTAR EN T
2 VALORES (3, 'C', 30);
INSERTAR EN T
VALORES (3, 'C',
1 filas afectadas
tiempo utilizado: 0.391 (ms) tic del reloj: 643640.
SQL> COMMIT;
COMETER;
tiempo utilizado: 11.657 (ms) tic del reloj: 19480330.
SQL> SELECCIONAR * DE T;
SELECCIONAR * DE T;
ID NOMBRE EDAD
1 1 A 10
2 2 B 20
3 3 C 30
3 filas tienen
tiempo de uso: 0.448 (ms) tic del reloj: 739460.


  Después de establecer una tabla de prueba, veamos si Dameng usa bloqueos de nivel de fila para bloquear registros:


SQL> ACTUALIZAR T
2 ESTABLECER EDAD = 20
3 DONDE ID = 1;
ACTUALIZAR T
SET EDAD = 20
DONDE ID = 1;
1 filas afectadas
tiempo utilizado: 0,554 (ms) tic del reloj: 917730.


  Cabe señalar que al realizar esta prueba, debe asegurarse de que AUTOCOMMIT esté cerrado.


  Actualice el registro con ID 2 en otra sesión, luego la sesión se bloquea:


SQL> ACTUALIZAR T
2 ESTABLECER EDAD = 30
3 DONDE ID = 2;


  Verifique el estado de bloqueo del sistema en la primera sesión:


SQL> SELECCIONAR TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, ROW_ID
2 FROM SYSTEM.SYSDBA.V $ LOCK
3 WHERE LTYPE! = 'DICT';
SELECCIONE TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, ROW_ID
FROM SYSTEM.SYSDBA.V $ LOCK
WHERE LTYPE! = 'DICT';
TRX_ID LTYPE LMODE BLOCKED TABLE_ID ROW_ID
1 1245 TABLE IX 0 1026 0x0000000000000000
2 1246 TABLE IX 0 1026 0x0000000000000000
3 1245 ROW X 0 1026 0x000000000033FD31
4 1246 ROW S 1 1026 0x000000000033FD31
4 filas de
reloj utilizado: 36925 tick.


  Como puede ver, el ID de transacción 1246 no está bloqueado porque quiere adquirir un bloqueo exclusivo, pero está bloqueado cuando se consulta el registro modificado. En otras palabras, en la base de datos Dameng, la escritura bloquea la lectura. Si desea evitar esta situación, puede crear un índice en la columna ID. En primer lugar, la sesión 1 envía si bloquear:


SQL> COMMIT;
COMETER;
tiempo utilizado: 50.458 (ms) tic del reloj: 84356900.


  En este momento, la operación ACTUALIZAR en la sesión 2 es exitosa:

1 filas de
tiempo afectado utilizado: 6652041.104 (ms) tic del reloj: 3358507298.


  Verifique la información de bloqueo actual nuevamente a continuación:


SQL> SELECCIONAR TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, ROW_ID
2 FROM SYSTEM.SYSDBA.V $ LOCK
3 WHERE LTYPE! = 'DICT';
SELECCIONE TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, ROW_ID
FROM SYSTEM.SYSDBA.V $ LOCK
WHERE LTYPE! = 'DICT';
TRX_ID LTYPE LMODE BLOCKED TABLE_ID ROW_ID
  
1 1246 TABLE IX 0 1026 0x0000000000000000
  
2 1246 ROW X 0 1026 0x000000000033FD32
2 filas tienen
tiempo usado: 0.405 (ms) tic de reloj: 668360.


  La transacción 1246, que estaba bloqueada hace un momento, ahora ha obtenido un bloqueo exclusivo. Puede estar seguro de que la fila actualmente bloqueada no es el registro bloqueado por 1245. Parece que lo que Dameng ha implementado es de hecho un bloqueo de nivel de fila, pero Dameng no ha resuelto el problema del bloqueo mutuo entre lectura y escritura. Para evitar el fenómeno en este momento, agregue un índice en la columna ID:


SQL> COMMIT;
COMETER;
tiempo utilizado: 11.548 (ms) tic del reloj: 19298280.
SQL> CREAR INDICE IND_T_ID
2 ON T (ID);
CREAR INDICE IND_T_ID
ON T (ID);
tiempo utilizado: 36.302 (ms) tic del reloj: 60422530.


  Ahora realice la misma operación nuevamente:


SQL> ACTUALIZAR T
2 ESTABLECER EDAD = 30
3 DONDE ID = 1;
ACTUALIZAR T
SET EDAD = 30
DONDE ID = 1;
1 filas afectadas
tiempo utilizado: 38.401 (ms) tic del reloj: 64196100.


  La ACTUALIZACIÓN de la sesión uno fue exitosa.


SQL> ACTUALIZAR T
2 ESTABLECER EDAD = 40
3 DONDE ID = 2;
ACTUALIZAR T
SET EDAD = 40
DONDE ID = 2;
1 filas afectadas
tiempo utilizado: 0,467 (ms) tic del reloj: 772190.


  La segunda sesión de la ACTUALIZACIÓN también fue exitosa. Verifique la información de bloqueo nuevamente en este momento:


SQL> SELECCIONE TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, ROW_ID
2 FROM SYSTEM.SYSDBA.V $ LOCK
3 WHERE LTYPE! = 'DICT';
SELECCIONE TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, ROW_ID
FROM SYSTEM.SYSDBA.V $ LOCK
WHERE LTYPE! = 'DICT';
TRX_ID LTYPE LMODE BLOCKED TABLE_ID ROW_ID
1 1247 TABLE IX 0 1026 0x0000000000000000
2 1249 TABLE IX 0 1026 0x0000000000000000
3 1249 ROW X 0 1026 0x000000000033FD32
4 1247 ROW X 0 1026 0x000000000033FD31
4 filas de
reloj de tiempo utilizado: 0,45


  Ahora puede ver claramente que dos transacciones simultáneas bloquean dos registros diferentes de la misma tabla. Esto muestra que el bloqueo a nivel de fila se realiza en Dameng. Aunque la información proporcionada por esta vista dinámica es tan intuitiva y clara, incluso en Oracle no sabemos qué registro está bloqueado, pero esto también expone un problema. Es decir, el bloqueo es un recurso en la base de datos Dameng y la base de datos necesita registrar cada registro bloqueado. Cuando la cantidad de datos es demasiado grande, para evitar consumir más recursos, Dameng Database adoptará una estrategia de actualización de bloqueo:


SQL> CREAR TABLA T_RECORD
2 (NÚMERO DE ID);
CREAR TABLA T_RECORD
(NÚMERO DE ID);
tiempo utilizado: 11.990 (ms) tic del reloj: 19871840.
SQL> INSERT INTO T_RECORD
2 SELECCIONAR ROWNUM FROM SYSTEM.SYSDBA.DUAL
3 CONNECT BY ROWNUM <1000000;
INSERT INTO T_RECORD
SELECT ROWNUM FROM SYSTEM.SYSDBA.DUAL
CONNECT BY ROWNUM <1000000;
1000000 filas afectadas
tiempo utilizado: 75496.092 (ms) tic del reloj: 1644487636.
SQL> COMMIT;
COMETER;
tiempo utilizado: 41.571 (ms) tic del reloj: 69449680.
SQL> SELECT COUNT (*) FROM SYSTEM.SYSDBA.V $ LOCK;
SELECCIONAR CONTEO (*) DE SYSTEM.SYSDBA.V $ LOCK;
 
1 1
1 filas obtenidas
tiempo utilizado: 0.395 (ms) tic del reloj: 651870.
SQL> ACTUALIZAR T_RECORD
2 SET ID = ID + 1;
ACTUALIZAR T_RECORD
SET ID = ID + 1;
1000000 filas afectadas
tiempo utilizado: 15544.108 (ms) tic del reloj: 186236054.
SQL> SELECT COUNT (*) FROM SYSTEM.SYSDBA.V $ LOCK;
SELECCIONAR CONTEO (*) DE SYSTEM.SYSDBA.V $ LOCK;
 
1803
1 filas tienen
tiempo de uso: 2.850 (ms) tic del reloj: 4754460.
SQL> SELECCIONE LTYPE, LMODE, COUNT (*)
2 FROM SYSTEM.SYSDBA.V $ LOCK
3 DONDE LTYPE! = 'DICT'
4 GROUP BY LTYPE, LMODE;
SELECCIONE LTYPE, LMODE, COUNT (*)
FROM SYSTEM.SYSDBA.V $ LOCK
WHERE LTYPE! = 'DICT'
GROUP BY LTYPE, LMODE;
LTYPE LMODE
1 TABLA IX 1
2 TABLA X 1
3 FILA X 800
3 filas tienen
tiempo de uso: 3.446 (ms) tic del reloj: 5750600.


  Como puede ver, después de adquirir 800 bloqueos de nivel de fila, la base de datos actualiza automáticamente los bloqueos de nivel de fila a bloqueos de nivel de tabla.


  El bloqueo no es un recurso costoso en Oracle, por lo que no habrá escalada de bloqueo. En Dameng, debido a que el bloqueo es un tipo de recurso, para evitar tener un gran número de bloqueos, Dameng adopta el método de actualización del bloqueo. Aunque esto afectará la concurrencia en ciertas circunstancias, este es el resultado de la compensación de recursos. SQLSERVER La base de datos también se implementa de esta manera.


  Sin embargo, en la base de datos Dameng, parece que la lectura no bloquea la escritura. Intente crear una tabla con registros de 100 W, inicie una sintaxis SELECT * FROM TABLE en una sesión y luego ejecute una instrucción UPDATE de tabla completa en otra sesión. Dado que SELECT necesita imprimir los resultados en la pantalla, la instrucción SELECT se completa después de UPDATE, lo que obviamente muestra que SELECT no bloquea UPDATE. Y es seguro que SELECT ocurrió antes de UPDATE, porque ejecutar la misma instrucción SELECT nuevamente será bloqueado por la operación de actualización UPDATE.


  En general, aunque el mecanismo de bloqueo de Dameng Database no es comparable al de Oracle, ya es bueno. El bloqueo a nivel de fila se puede lograr y la lectura no bloquea la escritura. Y la base de datos Dameng también puede lograr una lectura consistente de múltiples versiones, pero para lograr este método, debe modificar la configuración predeterminada en la configuración del parámetro de inicialización, y puede tener un cierto impacto en el rendimiento.

Supongo que te gusta

Origin blog.csdn.net/qq_42726883/article/details/108629422
Recomendado
Clasificación