Los inventory hints permiten integrar la lógica de control de transacciones directamente en las sentencias SQL. De este modo, se confirma o revierte una transacción según el resultado de la sentencia. En escenarios de escritura con alta concurrencia, como ventas flash y deducción de inventario, varias transacciones compiten por actualizar la misma fila al mismo tiempo. Esto genera contención de bloqueos que reduce el rendimiento. Los inventory hints resuelven cada escritura en competencia con un solo viaje de ida y vuelta, lo que elimina la necesidad de implementar lógica de reintentos en la aplicación. Úselos junto con la función statement queue para serializar las escrituras conflictivas en buckets y maximizar el rendimiento.
Versiones compatibles
Los inventory hints están disponibles en a continuación versiones de PolarDB for MySQL:
|
Versión |
Versión menor mínima del kernel |
|
PolarDB for MySQL 8.0 |
8.0.1.1.1 |
|
PolarDB for MySQL 5.7 |
5.7.1.0.17 |
|
PolarDB for MySQL 5.6 |
Todas las versiones menores |
Para comprobar la versión menor del kernel de su clúster, consulte Query the engine version.
Funcionamiento
Los inventory hints son compatibles con las sentencias SELECT, UPDATE, INSERT y DELETE. Existen tres hints disponibles:
|
Hint |
Efecto |
Se activa cuando |
|
|
Confirma la transacción actual |
La sentencia se ejecuta correctamente |
|
|
Revierte la transacción actual |
La sentencia falla |
|
|
Marca la sentencia como fallida si las filas afectadas no son iguales a |
Se ejecuta la sentencia |
Estos hints trabajan en conjunto para controlar tanto la operación DML como el resultado de la transacción en una sola sentencia:
COMMIT_ON_SUCCESSconfirma la transacción de inmediato cuando la sentencia se ejecuta correctamente.ROLLBACK_ON_FAILla revierte de inmediato cuando la sentencia falla.TARGET_AFFECT_ROW(n)convierte una discrepancia en el conteo de filas (por ejemplo, al actualizar un artículo agotado) en un fallo de sentencia. Después,ROLLBACK_ON_FAILdetecta ese fallo.
Al combinar los tres hints con la cola de sentencias, se serializan las escrituras conflictivas en buckets y se resuelve cada transacción en un solo viaje de ida y vuelta.
Sintaxis
La sintaxis difiere entre PolarDB for MySQL 5.6 y PolarDB for MySQL 5.7/8.0.
COMMIT_ON_SUCCESS
Confirma la transacción cuando la sentencia se ejecuta correctamente.
PolarDB for MySQL 5.6
UPDATE COMMIT_ON_SUCCESS t
SET c = c - 1
WHERE id = 1;
PolarDB for MySQL 5.7 y 8.0
UPDATE /*+ COMMIT_ON_SUCCESS */ t
SET c = c - 1
WHERE id = 1;
ROLLBACK_ON_FAIL
Revierte la transacción cuando la sentencia falla.
PolarDB for MySQL 5.6
UPDATE ROLLBACK_ON_FAIL t
SET c = c - 1
WHERE id = 1;
PolarDB for MySQL 5.7 y 8.0
UPDATE /*+ ROLLBACK_ON_FAIL */ t
SET c = c - 1
WHERE id = 1;
TARGET_AFFECT_ROW
Marca la sentencia como fallida si el número de filas afectadas no coincide con el valor especificado. Establecer el valor en 1 significa que la sentencia se ejecuta correctamente si se actualiza como mínimo un registro. Si ninguna fila coincide con la cláusula WHERE, la sentencia falla y devuelve un error.
PolarDB for MySQL 5.6
UPDATE TARGET_AFFECT_ROW 1 t
SET c = c - 1
WHERE id = 1;
-- ERROR HY000: The affected row number does not match that of user specified.
PolarDB for MySQL 5.7 y 8.0
UPDATE /*+ TARGET_AFFECT_ROW(1) */ t
SET c = c - 1
WHERE id = 1;
-- ERROR HY000: The affected row number does not match that of user specified.
Uso con la cola de sentencias
Combine COMMIT_ON_SUCCESS, ROLLBACK_ON_FAIL y TARGET_AFFECT_ROW con statement queue para enviar las escrituras conflictivas a la misma cola dentro de un bucket y resolver cada transacción en un solo paso.
PolarDB for MySQL 5.6: usa POLARDB_STATEMENT_CONCURRENT_QUEUE con una expresión de clave o un valor literal:
UPDATE COMMIT_ON_SUCCESS POLARDB_STATEMENT_CONCURRENT_QUEUE id ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1 Changed: 1 Warnings: 0
UPDATE COMMIT_ON_SUCCESS POLARDB_STATEMENT_CONCURRENT_QUEUE 1 ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1 Changed: 1 Warnings: 0
PolarDB for MySQL 5.7 y 8.0: usa CCL_QUEUE_VALUE dentro del bloque de hint /*+ ... */:
UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) CCL_QUEUE_VALUE('id') */ t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1 Changed: 1 Warnings: 0
UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) CCL_QUEUE_VALUE(1) */ t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1 Changed: 1 Warnings: 0
Restricciones
|
Restricción |
Alcance |
Detalles |
|
Modo |
Solo PolarDB for MySQL 8.0 |
No es posible ejecutar |
Si ejecuta COMMIT_ON_SUCCESS o ROLLBACK_ON_FAIL en el modo autocommit, se devuelve a continuación error:
UPDATE /*+ ROLLBACK_ON_FAIL */ t
SET c = c - 1
WHERE id = 1;
-- ERROR 7531 (HY000): Inventory transactinal hints didn't allowed in autocommit mode