tikv java客户端 悲观锁 报错

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
未使用tidb,Java客户端访问 事务kv

【概述】 场景 + 问题概述
在事务内,先读部分key-value,再修改部分key-value,需要保证读出的数据在事务还没完成时不被修改。

所以 是不是需要在读之前先对key加锁,类似如下操作

Kvrpcpb.Mutation mutation = Kvrpcpb.Mutation.newBuilder()
            .setKey(primaryKey)
            .setOp(Kvrpcpb.Op.PessimisticLock)
            .build();
RegionStoreClient client = tiSession.getRegionStoreClientBuilder().build(primaryKey);
client.prewrite(backOffer, primaryKey, Collections.singletonList(mutation), startTs, 10_000);

【应用框架及开发适配业务逻辑】
tikv java客户端 v3.2.0

【背景】 做过哪些操作
先对key加悲观锁,再preWrite部分key,最后一起commit

【现象】 业务和数据库现象
用java客户端加锁时报错

【问题】 当前遇到的问题

【业务影响】

【TiDB 版本】

【附件】 相关日志及监控(https://metricstool.pingcap.com/)


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

2赞

根据官网的描述,目前 tikv java client 还不支持事务

1赞

啥时候支持?

1赞

但是看到java客户端里还有一种mutation是Lock,preWrite这种mutation之后,用tikv-ctl工具查看lock column的确写入了一条记录

lock cf value: r_type: Lock start_ts: 432475014163857410 primary: 6D796B6579

好像go客户端是支持悲观锁的,用go客户端写入的悲观锁记录是这样的:

lock cf value: r_type: PessimisticLock start_ts: 432473798300663810 primary: 6D796B6579

不知道两种mutation有什么不同?

client java 暂时支持乐观事务,如果需要完整的事务功能推荐使用 client-go,目前 client-java 暂时聚焦在 RawKV 的功能上。

你好,想请问一下,关于java客户端preWrite了一个Lock类型的mutation,这个锁与client-go的悲观锁,有什么区别吗?前者好像是有ttl的,是不是悲观锁应该不存在ttl?

现在 java client prewrite 的 lock 是乐观锁,乐观锁的 TTL 的含义是如果这个事务的 commit 时间超过了 TTL。当他准备提交这个事务的时候会发现另外遇到这个锁的事务把这把锁给回滚了,这个时候会报错:TxnLockNotFound。悲观锁也会有 TTL, 只是这个锁不会被回滚,而是通过 txn heartbeat 更新 TTL。