tikv api 中的锁键是做什么用的?

如何解决tikv api 中的锁键是做什么用的?

最近在看tikv的api文档。交易中有一个LockKey api。当我调用它进行操作时,我直接恐慌。 我有问题?

  1. 我想知道它为什么会恐慌
  2. lockKeys api 有什么用? 有什么可以帮我的吗
    txn1,txn2 := begin(),begin()
    fmt.Println("txn1 before:",txn1.Ispessimistic())
    txn1.Setoption(kv.pessimistic,true)
    fmt.Println("txn1 after:",txn1.Ispessimistic())

    fmt.Println("txn2 before:",txn2.Ispessimistic())
    txn2.Setoption(kv.pessimistic,true)
    fmt.Println("txn2 after:",txn2.Ispessimistic())

    err := txn1.Set(k2,v22)
    if err != nil {
        panic(err)
    }
    err = txn1.Set(k1,v22)
    if err != nil {
        panic(err)
    }
    lockCtx1 := &kv.LockCtx{ForUpdateTS: txn1.StartTS(),WaitStartTime: time.Now()}
    err = txn1.LockKeys(context.Background(),lockCtx1,k1,k2)
    if err!=nil{
        panic(err)
    }
    err = txn2.Set(k2,v23)
    if err != nil {
        panic(err)
    }
    err = txn2.Set(k1,v23)
    if err != nil {
        panic(err)
    }
    lockCtx2 := &kv.LockCtx{ForUpdateTS: txn2.StartTS(),WaitStartTime: time.Now()}
    err = txn2.LockKeys(context.Background(),lockCtx2,k2)
    if err!=nil{
        panic(err)
    }
    err = txn1.Commit(context.Background())
    if err != nil {
        panic(err)
    }
    fmt.Println(get(k2))
    err = txn2.Commit(context.Background())
    if err != nil {
        panic(err)
    }

恐慌堆栈是:

panic: runtime error: index out of range [0] with length 0
goroutine 1 [running]:
github.com/pingcap/tidb/store/tikv.actionpessimisticLock.handleSingleBatch(0xc0002d6380,0xc00036c3c0,0xc0002d6400,0x4,0x1,0x2,0x0,0xc000288bd0,...)
        /Users/go/pkg/mod/github.com/pingcap/tidb@v1.1.0-beta.0.20210419034717-00632fb3c710/store/tikv/2pc.go:922 +0x1442
github.com/pingcap/tidb/store/tikv.(*twoPhaseCommitter).doActionOnBatches(0xc00036c3c0,0x4d430e0,0xc0002d6380,0xc0002d6500,0x0)
        /Users/go/pkg/mod/github.com/pingcap/tidb@v1.1.0-beta.0.20210419034717-00632fb3c710/store/tikv/2pc.go:678 +0x110
github.com/pingcap/tidb/store/tikv.(*twoPhaseCommitter).doActionOnGroupMutations(0xc00036c3c0,0xc0002d6480,0x0)
        /Users/go/pkg/mod/github.com/pingcap/tidb@v1.1.0-beta.0.20210419034717-00632fb3c710/store/tikv/2pc.go:623 +0x442
github.com/pingcap/tidb/store/tikv.(*twoPhaseCommitter).doActionOnMutations(0xc00036c3c0,...)
        /Users/go/pkg/mod/github.com/pingcap/tidb@v1.1.0-beta.0.20210419034717-00632fb3c710/store/tikv/2pc.go:513 +0x1c3
github.com/pingcap/tidb/store/tikv.(*twoPhaseCommitter).pessimisticLockMutations(...)
        /Users/go/pkg/mod/github.com/pingcap/tidb@v1.1.0-beta.0.20210419034717-00632fb3c710/store/tikv/2pc.go:1291
github.com/pingcap/tidb/store/tikv.(*tikvTxn).LockKeys(0xc0000f60c0,0x4d44e60,0xc00012c000,0xc000288ba0,0x0)
        /Users/go/pkg/mod/github.com/pingcap/tidb@v1.1.0-beta.0.20210419034717-00632fb3c710/store/tikv/txn.go:446 +0x5f9
main.testTxn(0xc00003e068,0xc00003e088,0xc00003e096,0x7,0xc00003e0a0,...)

它出现在 where painc happen 中,m 为零

go mod 在下面

go 1.14

require (
    github.com/juju/errors v0.0.0-20200330140219-3fe23663418f
    github.com/juju/testing v0.0.0-20210324180055-18c50b0c2098 // indirect
    github.com/pingcap/parser v0.0.0-20210107054750-53e33b4018fe
    github.com/pingcap/tidb v1.1.0-beta.0.20210419034717-00632fb3c710
    golang.org/x/net v0.0.0-20210226172049-e18ecbb05110
)

解决方法

对于问题 2,lockKeys 将锁定您在 KVStore(TiKV) 中提供的密钥的条目

对于问题 1,请分享整个恐慌堆栈。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?