Todos os produtos
Search
Central de documentação

ApsaraDB RDS:Use o recurso inventory hint

Última atualização: Jun 26, 2026

Este tópico descreve o recurso inventory hint do AliSQL. Use esse recurso em conjunto com os recursos returning e statement queue para confirmar e reverter transações em alta velocidade e aumentar o throughput da sua aplicação.

Informações básicas

Em casos de uso como vendas relâmpago, a redução de estoque é uma tarefa comum que exige alta concorrência e processamento serializado. O AliSQL usa filas e hints transacionais para controlar a concorrência, o que permite confirmar ou reverter transações rapidamente e melhorar o throughput do negócio.

O recurso inventory hint aumenta o desempenho de uma instância do ApsaraDB RDS for MySQL para até 31.000 transações por segundo (TPS) durante a atualização de hot data em uma única linha de tabela. Para mais informações, consulte Método de teste e resultados de atualizações de hot data em uma única linha.

Pré-requisitos

A instância RDS deve executar uma das seguintes versões do MySQL:

  • MySQL 8.4

  • MySQL 8.0

  • MySQL 5.7

  • MySQL 5.6

Sintaxe

Os seguintes hints estão disponíveis para uso em instruções SELECT, UPDATE, INSERT e DELETE:

  • Para MySQL 5.7, 8,0 e 8,4:

    • Estão disponíveis os seguintes hints transacionais:

      • COMMIT_ON_SUCCESS: confirma a transação se a execução da instrução com este hint for bem-sucedida.

      • ROLLBACK_ON_FAIL: reverte a transação se a execução da instrução com este hint falhar.

      Sintaxe:

      /*+ COMMIT_ON_SUCCESS */
      /*+ ROLLBACK_ON_FAIL */

      Exemplo:

      UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL */ T
      SET c = c - 1
      WHERE id = 1;
    • O hint condicional TARGET_AFFECT_ROW(NUMBER) também está disponível.

      Ao aplicar esse hint condicional à instrução atual, a execução só terá êxito se o número de linhas afetadas corresponder exatamente ao valor especificado no hint.

      Sintaxe:

      /*+ TARGET_AFFECT_ROW(NUMBER) */

      Exemplo:

      UPDATE /*+ TARGET_AFFECT_ROW(1) */ T
      SET c = c - 1
      WHERE id = 1;
  • MySQL 5.6

    A sintaxe dos hints no MySQL 5.6 é semelhante à dos hints no MySQL 5.7 e MySQL 8.0. A única diferença é que não é necessário incluir os hints do MySQL 5.7 e MySQL 8.0 dentro de comentários.

    Exemplo:

    UPDATE COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL T
    SET c = c - 1
    WHERE id = 1;
    UPDATE TARGET_AFFECT_ROW(1) T
    SET c = c - 1
    WHERE id = 1;

Observações de uso

  • Os hints devem ser seguidos pelos nomes das tabelas.

  • Quando um hint usado em uma transação entra em vigor, ele aciona uma confirmação automática da transação. Por isso, posicione o hint na última instrução SQL da transação.

  • Hints transacionais não oferecem suporte ao modo autocommit. Se você usar um hint transacional em uma instrução executada nesse modo, o sistema relatará um erro. Exemplo:

    mysql> UPDATE /*+ commit_on_success rollback_on_fail target_affect_row(1) */ t
        -> SET col1 = col1 + 1
        -> WHERE id = 1;
    ERROR 7531 (HY000): Inventory transactional hints didn't allowed in autocommit mode
  • Não é possível usar hints transacionais em subinstruções. Caso utilize um hint transacional em uma subinstrução, o sistema relatará um erro. Exemplo:

    mysql> CREATE TRIGGER tri_1
        -> BEFORE INSERT ON t
        -> FOR EACH ROW
        -> BEGIN
        -> INSERT /*+ commit_on_success */ INTO t1 VALUES (1);
        -> end//
    
    mysql> INSERT INTO t VALUES (2, 1);
    ERROR HY000: Inventory transactional hints didn't alllowed in stored procedure
  • Hints condicionais não são permitidos em instruções SELECT ou EXPLAIN. A utilização desses hints nessas instruções resulta em erro. Exemplo:

    mysql> EXPLAIN UPDATE /*+ commit_on_success rollback_on_fail target_affect_row(1) */ t
        -> SET col1 = col1 + 1
        -> WHERE id = 1;
    ERROR 7532 (HY000): Inventory conditional hints didn't match with result
    Nota

    Especifique um número inválido em TARGET_AFFECT_ROW e verifique se o sistema relata erros:

    mysql> EXPLAIN UPDATE /*+ commit_on_success rollback_on_fail target_affect_row(-1) */ t
        -> SET col1 = col1 + 1
        -> WHERE id = 1;
    +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
    | id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra       |
    +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
    |  1 | UPDATE      | t     | NULL       | range | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | Using where |
    +----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
    1 row in set, 2 warnings (0.00 sec)
    
    mysql> show warnings;
    +---------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Level   | Code | Message                                                                                                                                 |
    +---------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    | Warning | 1064 | Optimizer hint syntax error near '-1) */ t set col1=col1+1 where id =1' at line 1                                                       |
    | Note    | 1003 | update /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL */ `test`.`t` set `test`.`t`.`col1` = (`test`.`t`.`col1` + 1) where (`test`.`t`.`id` = 1) |
    +---------+------+-----------------------------------------------------------------------------------------------------------------------------------------+
    2 rows in set (0.00 sec)

Uso com o recurso returning

Combine o recurso inventory hint com o recurso returning para permitir que o sistema retorne conjuntos de resultados em tempo real. Para mais informações, consulte Returning. Exemplo:

mysql> CALL dbms_trans.returning("*", "update /*+ commit_on_success rollback_on_fail target_affect_row(1) */ t
                                       set col1=col1+1 where id=1");
+----+------+
| id | col1 |
+----+------+
|  1 |   13 |
+----+------+
1 row in set (0.00 sec)

mysql> CALL dbms_trans.returning("*", "insert /*+ commit_on_success rollback_on_fail target_affect_row(1) */ into
                                       t values(10,10)");
+----+------+
| id | col1 |
+----+------+
| 10 |   10 |
+----+------+
1 row in set (0.01 sec)
            

Uso com o recurso statement queue

Utilize o recurso inventory hint junto com o recurso statement queue para que o sistema coloque as instruções em fila. Para mais informações, consulte Statement queue. Exemplo:

mysql> UPDATE /*+ ccl_queue_field(id) commit_on_success 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

mysql> UPDATE /*+ ccl_queue_value(1) commit_on_success 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