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,请分享整个恐慌堆栈。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...