ob:4.2.1.8
启用V3版本路由(v4版本分布式事务路由功能默认true表示开启的,false表示启用v3的路由策略):
mysql> show proxyconfig like 'enable_transaction_internal_routing' \G show proxyconfig like 'enable_transaction_internal_routing' \G
*************************** 1. row ***************************
name: enable_transaction_internal_routing
value: False
info: if enabled, proxy will route the dml statement in a transaction to different servers
need_reboot: false
visible_level: USER
range:
config_level: LEVEL_GLOBAL
1 row in set (0.00 sec)
*************************** 1. row ***************************
name: enable_transaction_internal_routing
value: False
info: if enabled, proxy will route the dml statement in a transaction to different servers
need_reboot: false
visible_level: USER
range:
config_level: LEVEL_GLOBAL
1 row in set (0.00 sec)
创建表:
mysql> show create table t1 \G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`C1` int(11) DEFAULT NULL,
`C2` int(11) DEFAULT NULL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
partition by hash(c1)
(partition `p0`,
partition `p1`)
1 row in set (0.00 sec)
CREATE TABLE T2(C1 INT,C2 INT) PARTITION BY HASH(C1) PARTITIONS 2;
插入语句:
mysql> INSERT INTO T1 VALUES(1,1); INSERT INTO T1 VALUES(2,2); INSERT INTO T2 VALUES(11,11); INSERT INTO T2 VALUES(22,22);
Query OK, 1 row affected (0.02 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.01 sec)
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+------+------+
| C1 | C2 |
+------+------+
| 1 | 1 |
| 2 | 2 |
+------+------+
2 rows in set (0.01 sec)
mysql> select * from t2;
+------+------+
| C1 | C2 |
+------+------+
| 22 | 22 |
| 11 | 11 |
+------+------+
2 rows in set (0.01 sec)
mysql> select * from t1 partition(p0);
+------+------+
| C1 | C2 |
+------+------+
| 2 | 2 |
+------+------+
1 row in set (0.00 sec)
mysql> select * from t1 partition(p1);
+------+------+
| C1 | C2 |
+------+------+
| 1 | 1 |
+------+------+
1 row in set (0.00 sec)
查看数据分布:
+---------------+------------+------------+----------------+-------+--------------+--------+
| DATABASE_NAME | TABLE_NAME | TABLE_TYPE | PARTITION_NAME | ZONE | SVR_IP | ROLE |
+---------------+------------+------------+----------------+-------+--------------+--------+
| test | t1 | USER TABLE | p0 | zone1 | 10.xx.xx.220 | LEADER |
| test | t1 | USER TABLE | p1 | zone2 | 10.xx.xx.221 | LEADER |
+---------------+------------+------------+----------------+-------+--------------+--------+
可以看到p0的leader在220上,p1的leader在221上
模拟事务(在220上执行):
BEGIN;
update t1 set c2=3 where c1=1;
update t1 set c2=4 where c1=2;
update t2 set c2=33 where c1=11;
update t2 set c2=43 where c1=22;
COMMIT;
查看事务执行情况:
mysql> select query_sql,tx_id from oceanbase.gv$ob_sql_audit where query_sql like 'update t1 set c2=3 where c1=1%' order by request_time desc limit 1;
+-------------------------------+----------+
| query_sql | tx_id |
+-------------------------------+----------+
| update t1 set c2=3 where c1=1 | 11538142 |
+-------------------------------+----------+
1 row in set (0.11 sec)
mysql> select SVR_IP,SVR_PORT,query_sql,TX_ID,TX_INTERNAL_ROUTING,PLAN_TYPE ,PARTITION_HIT,FROM_UNIXTIME(request_time/1000000) from oceanbase.gv$ob_sql_audit where TX_ID=11538142 order by request_time;
+--------------+----------+---------------------------------+----------+---------------------+-----------+---------------+-------------------------------------+
| SVR_IP | SVR_PORT | query_sql | TX_ID | TX_INTERNAL_ROUTING | PLAN_TYPE | PARTITION_HIT | FROM_UNIXTIME(request_time/1000000) |
+--------------+----------+---------------------------------+----------+---------------------+-----------+---------------+-------------------------------------+
| 10.xx.xx.221 | 2882 | begin | 11538142 | 1 | 0 | 1 | 2025-07-21 14:16:54.8814 |
| 10.xx.xx.221 | 2882 | update t1 set c2=3 where c1=1 | 11538142 | 1 | 1 | 1 | 2025-07-21 14:17:13.5427 |
| 10.xx.xx.221 | 2882 | update t1 set c2=4 where c1=2 | 11538142 | 1 | 2 | 0 | 2025-07-21 14:17:13.5462 |
| 10.xx.xx.221 | 2882 | update t2 set c2=33 where c1=11 | 11538142 | 1 | 2 | 0 | 2025-07-21 14:17:13.5596 |
| 10.xx.xx.221 | 2882 | update t2 set c2=43 where c1=22 | 11538142 | 1 | 1 | 1 | 2025-07-21 14:17:13.5705 |
| 10.xx.xx.221 | 2882 | COMMIT | 11538142 | 0 | 0 | 1 | 2025-07-21 14:17:13.5716 |
+--------------+----------+---------------------------------+----------+---------------------+-----------+---------------+-------------------------------------+
6 rows in set (0.12 sec)
疑问:
模拟V3在事务执行(事务的工作方式是同一个事务的语句统一路由到一个数据节点上执行),在哪个节点开启事务就在那个节点执行,这里执行节点应该是220,
但是TX_INTERNAL_ROUTING 查询结果为0 才对,为什么这里是1呢?