6.1.0 内存悲观锁不丢失

【版本】6.1.0 arm
【步骤】
创建 t1 (id int primary key, name varchar);
insert into t1 values(1, “xiaohong”);

创建 t2 (id int primary key, name varchar);
insert into t2 values(100, “hha”);

找出 t1 的表数据的 region leader 所在的 store,假设 tikv1.

tx1, begin;
tx1: update t1 set name = “xiaoming” where name = “xiaohong”; 让 tx1 持有内存悲观锁.

tx2:session 2 执行 update t1 set name = “xiaohua” where name = “xiaohong”; 将会被阻塞

kill tikv1; 让 tx1 的锁丢失。
等待一定时间,session 2执行成功。
txn3: session3 执行 update t2 set name = “xxxx” where name=“hha”; 顺利提交。

tx1: 执行 update t2 set name = “yyy”; 刷新 tx1 的 forupdatets 使得其 > tx2 的commitTs.

tx1 执行 commit,检查能否提交成功。

【结果】
1、会话1 更新t1 找到leader

2、会话2更新相同行 ,阻塞
b58e925e8d2c673a6a06fa94b223192

3、leader上kill tikv

kill leader tikv后内存锁并没有丢失,会话2一直处于阻塞状态

参数配置:

系统视图:

4、会话1commit后 会话2执行成功
image
image
leader已经是store 2了


【问题】
1、 leader tikv节点kill 内存悲观锁不释放 不丢失(貌似被同步了,切到了store 2),被阻塞会话一直阻塞不符合预期( 应该 没kill错leader)
2、有什么更直观的方式能够看到当前锁的持有者等相关信息?

这个也上到版主交流会上来~

最好先有研发大佬试一试

在看了~hhhh

1、 leader tikv节点kill 内存悲观锁不释放 不丢失(貌似被同步了,切到了store 2),被阻塞会话一直阻塞不符合预期( 应该 没kill错leader)

加悲观锁这个操作的确是只纯内存的,但如果加锁之后短时间内没有提交掉,后台会开启不断的 TxnHeartBeat 操作,更新现有锁的 TTL,防止这个锁被清除掉。

TxnHeartBeat 更新 TTL 没有加上内存优化,还是走 Raft 并持久化的。所以你尝试的时候发现锁被同步了很可能是因为 TxnHeartBeat 写入了持久化的悲观锁。

2、有什么更直观的方式能够看到当前锁的持有者等相关信息?

如果锁是内存锁,那肯定只在 leader 上面。不过并没有什么好方法能看到现在某个锁到底是否被持久化了。

感谢大佬,ttl多久更新一次,也就是说在ttl更新是把锁信息进行了持久化写入? 这块后续要怎么处理?

嗯,是 TTL 把锁信息进行了持久化写入。更新 TTL 是 10 秒一次。这个方式应该也不会改,因为我想一个需要更新 TTL 的事务,存活时间比较久,把锁持久化了减小丢失的概率应该更好。而毕竟这种事务应该不会很多,大部分情况下效率上也不会有牺牲。

真复杂…:custard:

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