有关tidb3.0.5悲观锁问题

前提: tidb版本3.0.5

tidb_txn_mode(开启后行锁)

操作过程:开启全局悲观锁,将 tidb_txn_mode 设置为 'pessimistic'
查看SESSION级别的状态并没有没有改变

SET GLOBAL tidb_txn_mode = 'pessimistic';
select @@SESSION.tidb_txn_mode;

image

问题1、

为什么开启全局级别的悲观锁,session级别的却没有变化。是否存在优先级事务先走GLOBAL在走SESSION级别?

问题2、

是否开启GLOBAL/SESSION级别的悲观锁,支持的显示事务(即非 autocommit 的事务)

问题3、

1、滚动升级到tidb3.0.8后,锁的默认状态? 2、tidb3.0.8开启悲观锁后,GLOBAL/SESSION级别所支持的是否都是显示事务(即非 autocommit 的事务),还是有所变化?

  1. 设置 global 级别变量之后,需要重新连接,对于新建立的 session 会生效
  2. 目前悲观锁是支持的是显示事务,autocommit 的隐式事务,还是乐观锁的形式
  3. 如果是升级到 v3.0.8 的,默认还是乐观锁,需要手动设置一下,如果是新安装的 v3.0.8 集群,那默认是悲观锁

global/session 级别的悲观锁都是对于显式事务而言

老师你好,如果我直接安装TiDB v3.0.9, 默认是 悲观锁, 这时我所有的应用程序是不是也需要全部都改为 显示事务调用?

如果我没有改变程序中对事务的控制,那么还都是乐观锁模式对吧?

如果是这样的,那我就明白了,以后不会在程序中设置隐事务

多谢!!!

我重新链接tidb-server查看了下session级别的 tidb_txn_mode还是“空”的,别没有变成“pessimistic”

1、那是否代表tidb_txn_mode已经开启悲观锁且已经生效

验证已经生效

2、是否存在优先级事务先走GLOBAL在走SESSION级

优先使用的GLOBAL级别

前置条件

执行SQL的客户端地址: 172.168.180.46

执行SQL的客户端地址: 172.168.180.47

TiDB-Server: 172.168.180.33


创建数据库
CREATE DATABASE eric;

USE eric;

DROP TABLE table1;

# 创建表
CREATE TABLE `table1` (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

# 插入数据
INSERT INTO table1(id, name) VALUES (1000, '张三'), (2000, 'PingCAP');

# 查看
mysql> SELECT * FROM table1;
+------+---------+
| id   | name    |
+------+---------+
| 1000 | 张三    |
| 2000 | PingCAP |
+------+---------+
2 rows in set (0.00 sec)

mysql>



测试更新数据冲突
事务一 步骤 事务二
172.168.180.46 172.168.180.47
准备数据查询结果 name='张三' 0 准备数据查询结果 name='张三'
BEGIN; 1 BEGIN;
UPDATE table1 SET name='TiDB' WHERE id = 1000; 2
查询结果 name='TiDB' 3 查询结果 name='张三'
4 UPDATE table1 SET name='TUG' WHERE id = 1000;
5 此时事务二,一直处于等待状态(获取锁中),直到事务一执行COMMIT;
COMMIT; 6
查询结果 name='TiDB' 7 查询结果 name='TUG'
8 COMMIT;
查询结果 name='TUG' 9 查询结果 name='TUG'



:+1::+1::+1: