Hint 名称 | 作用范围 | 用途 |
TXSQL_FORCE_LOCK | 事务级 | 在一个事务里更新多个不同热点行 |
TXSQL_FORCE_LOCK_INDEPENDENT_GROUP | 单热点行级 | 允许同一事务对同一热点行进行多次访问 |
/*+ ... */ 语法,紧跟在 UPDATE / INSERT / DELETE 关键字之后:UPDATE /*+ TXSQL_FORCE_LOCK */ table_name SET col = ... WHERE ...;UPDATE /*+ TXSQL_FORCE_LOCK TXSQL_FORCE_LOCK_INDEPENDENT_GROUP */ table_name SET col = ... WHERE ...;
放置位置 | 实际效果 |
事务第一次访问行 X 的 DML 上 | 行 X 进入独立组,本事务对行 X 的后续访问全部放行 |
事务第二次及之后访问行 X 的 DML 上 | Hint 等同于没写:行 X 在第一次访问时已被记录为「非独立组」,本次访问被判为「二次访问同一热点行」,事务回滚 |
当前事务不是 TXSQL_FORCE_LOCK 事务 | 解析期 warning + 丢弃,按普通语句处理 |
BEGIN;-- ① 第一条 DML 必须带 TXSQL_FORCE_LOCKUPDATE /*+ TXSQL_FORCE_LOCK */ t_account SET balance = balance + 100 WHERE id = 1;-- ② 第二条及后续 DML 不需要再带 hint,事务已经处于 force_lock 模式UPDATE t_account SET balance = balance + 100 WHERE id = 2;UPDATE t_account SET balance = balance + 100 WHERE id = 3;COMMIT;
BEGIN;-- ① 首次访问 id=1,必须同时带两个 hintUPDATE /*+ TXSQL_FORCE_LOCK TXSQL_FORCE_LOCK_INDEPENDENT_GROUP */t_account SET balance = balance + 1 WHERE id = 1;-- ② 之后对 id=1 的访问不需要、也不应该再带 INDEPENDENT_GROUPUPDATE t_account SET balance = balance + 1 WHERE id = 1;COMMIT;
BEGIN;-- 首次访问 id=1 时漏掉了 INDEPENDENT_GROUPUPDATE /*+ TXSQL_FORCE_LOCK */ t_account SET balance = balance + 1 WHERE id = 1;-- 在第二次访问时才补上 INDEPENDENT_GROUP —— 已经太晚-- 此时 id=1 已被记录为「非独立组」,本条会被判为「二次访问同一热点行」,事务回滚UPDATE /*+ TXSQL_FORCE_LOCK_INDEPENDENT_GROUP */t_account SET balance = balance + 1 WHERE id = 1;COMMIT;
SHOW WARNINGS 排查是否因放置位置错误被忽略)。文档反馈