leojiang
(leojiang)
1
前提:
tidb版本3.0.5
tidb_txn_mode(开启后行锁)
操作过程:开启全局悲观锁,将 tidb_txn_mode
设置为 'pessimistic'
查看SESSION级别的状态并没有没有改变
SET GLOBAL tidb_txn_mode = 'pessimistic';
select @@SESSION.tidb_txn_mode;
问题1、
为什么开启全局级别的悲观锁,session级别的却没有变化。是否存在优先级事务先走GLOBAL在走SESSION级别?
问题2、
是否开启GLOBAL/SESSION级别的悲观锁,支持的显示事务(即非 autocommit 的事务)
问题3、
1、滚动升级到tidb3.0.8后,锁的默认状态?
2、tidb3.0.8开启悲观锁后,GLOBAL/SESSION级别所支持的是否都是显示事务(即非 autocommit 的事务),还是有所变化?
- 设置 global 级别变量之后,需要重新连接,对于新建立的 session 会生效
- 目前悲观锁是支持的是显示事务,autocommit 的隐式事务,还是乐观锁的形式
- 如果是升级到 v3.0.8 的,默认还是乐观锁,需要手动设置一下,如果是新安装的 v3.0.8 集群,那默认是悲观锁
global/session 级别的悲观锁都是对于显式事务而言
老师你好,如果我直接安装TiDB v3.0.9, 默认是 悲观锁, 这时我所有的应用程序是不是也需要全部都改为 显示事务调用?
如果我没有改变程序中对事务的控制,那么还都是乐观锁模式对吧?
如果是这样的,那我就明白了,以后不会在程序中设置隐事务
leojiang
(leojiang)
4
多谢!!!
我重新链接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'
|
system
(system)
关闭
7
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。