Todos los productos
Search
Centro de documentos

PolarDB:Inventory hint

Última actualización: Sep 05, 2026

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

COMMIT_ON_SUCCESS

Confirma la transacción actual

La sentencia se ejecuta correctamente

ROLLBACK_ON_FAIL

Revierte la transacción actual

La sentencia falla

TARGET_AFFECT_ROW(n)

Marca la sentencia como fallida si las filas afectadas no son iguales a n

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_SUCCESS confirma la transacción de inmediato cuando la sentencia se ejecuta correctamente.

  • ROLLBACK_ON_FAIL la 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_FAIL detecta 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 autocommit

Solo PolarDB for MySQL 8.0

No es posible ejecutar COMMIT_ON_SUCCESS ni ROLLBACK_ON_FAIL cuando autocommit está habilitado. Deshabilite autocommit antes de usar estos hints o incluya la sentencia en una transacción explícita.

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