节点数据写入各节点查询不一致问题

要么自动提交+显示事务,要么改rc隔离级别

mvcc事务隔离了

原来丢数据是真的

GLOBAL全局修改的参数对已经连接的会话是不生效的

事务要以 begin 开始。不能用设置系统变量 @@autocommit; 来替代。

tidb事物与mysql事物感觉使用上还有一点的差异

mysql会话1,写入一条数据并提交
mysql> set @@autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
±-------------+
| @@autocommit |
±-------------+
| 0 |
±-------------+
1 row in set (0.00 sec)

mysql> show global variables like ‘autocommit’;
±--------------±------+
| Variable_name | Value |
±--------------±------+
| autocommit | OFF |
±--------------±------+
1 row in set (0.01 sec)

mysql> select * from tb_test;
±-----±------+
| id | name |
±-----±------+
| 1 | name1 |
| 2 | name2 |
±-----±------+
2 rows in set (0.00 sec)

mysql> insert into tb_test values(3,‘name3’);
Query OK, 1 row affected (0.00 sec)

mysql> select * from tb_test;
±-----±------+
| id | name |
±-----±------+
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
±-----±------+
3 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql会话2(未开启新的会话,在原来的会话查询):
mysql> select * from tb_test;
±-----±------+
| id | name |
±-----±------+
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
±-----±------+
3 rows in set (0.00 sec)

mysql会话是可以查得到会话1的数据的,但是tidb的话 另外的节点需要重新连接才能查得到,这里与mysql使用上有差别

可以给个具体例子吗? 是不是我的验证方法不对
节点1会话:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tb_test values(20,‘name20’);
Query OK, 1 row affected (0.01 sec)

mysql> commit;
Query OK, 0 rows affected (0.04 sec)

mysql> select * from tb_test;
±-----±-------+
| id | name |
±-----±-------+
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
| 4 | name4 |
| 5 | name5 |
| 6 | name6 |
| 7 | name7 |
| 8 | name8 |
| 9 | name9 |
| 10 | name10 |
| 11 | name11 |
| 12 | name12 |
| 13 | name13 |
| 14 | name14 |
| 15 | name15 |
| 16 | name16 |
| 17 | name17 |
| 18 | name18 |
| 19 | name19 |
| 20 | name20 |
±-----±-------+
20 rows in set (0.00 sec)

节点2会话(原有会话,未重新连接)
mysql> select * from tb_test;
±-----±-------+
| id | name |
±-----±-------+
| 1 | name1 |
| 2 | name2 |
| 3 | name3 |
| 4 | name4 |
| 5 | name5 |
| 6 | name6 |
| 7 | name7 |
| 8 | name8 |
| 9 | name9 |
| 10 | name10 |
| 11 | name11 |
| 12 | name12 |
| 13 | name13 |
| 14 | name14 |
| 15 | name15 |
| 16 | name16 |
| 17 | name17 |
| 18 | name18 |
| 19 | name19 |
±-----±-------+
19 rows in set (0.00 sec)

查不到id=20的数据

这也太可怕了。

你在检查下会话2的autocommit

mysql> select @@autocommit;
±-------------+
| @@autocommit |
±-------------+
| 0 |
±-------------+
1 row in set (0.00 sec)

是不是我使用的姿势不对,总感觉跟mysql的有差别的,所以使用起来总感觉tidb那里出的问题

会话2中这个是执行的第一个SQL吗? 你继续在会话1插入,然后会话2在观察,应该也是看不到的。

我再验证下,可能是我的验证有误

重新验证了下,行为跟mysql一致,之前是我理解有误。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。