session.txnState初始化
如果当前session不在事务中,则reset session的txnState
pkg/sql/executor.go
|
|
begin设置session事务状态
pkg/sql/txn.go
|
|
生成internal txn
pkg/sql/session.go
|
|
internal txn时间戳——txn begin timestamp
pkg/internal/client/txn.go
|
|
使用HLC clock.Now
获取当前时间戳。
Insert KV写到client.Batch
初始化client.Batch
pkg/sql/tablewriter.go
|
|
tableInsert初始化client.Batch, 同时调用InsertRow插入KV数据。
调用client.Batch的Cput方法
pkg/sql/sqlbase/rowwriter.go
|
|
pkg/internal/client/batch.go
|
|
client.Batch传递给roachpb.BatchRequest
roachpb.BatchRequest初始化
pkg/internal/client/db.go
|
|
这里将client.Batch
中的请求直接赋给了ba.Requests.
|
|
roachpb.BatchRequest Header初始化
pkg/internal/client/txn.go
|
|
roachpb.BatchRequest添加roachpb.BeginTransactionRequest
pkg/internal/client/txn.go
|
|
txn.mu.Proto.Key
使用client.Batch
里面第一个请求的key作为txn的key,
新生成一个rochpb.BeginTransactionRequest
作为transaction record.
找到对应replica
请参考中的DistSender根据不同的key,选择不同的range
roachpb.BatchRequest转化为Raft Command
单个replica接收的请求不能直接执行,直接执行可能出现多个副本数据不一致的情况。
必须走Raft Group去执行。这里需要把roachpb.BatchRequest
请求转化为Raft Command
.
初始化rocksdbBatch
rocksdbBatch是rocksdb提供的batch操作方式,用于进行批量操作,可以看成一个事务集合内的操作。
rocksdbBatch主要用于将request转化为command,转化之后,会将rocksdbBatch close, 而不是commit。
pkg/storage/replica.go
|
|
pkg/storage/engine/rocksdb.go
|
|
每个request对应的eval函数
pkg/storage/replica.go
|
|
pkg/storage/replica_command.go
|
|
根据request的方法类型,找到对应的cmd,并进行Eval方法调用。
cmds初始化
|
|
BeginTransaction注册到cmds
pkg/storage/batcheval/cmd_begin_transaction.go
|
|
ConditionPut注册到cmds
pkg/storage/batcheval/cmd_conditional_put.go
|
|
BeginTransaction Eval方法
|
|
转化为raft command
pkg/storage/replica.go
|
|
proposal会有一个doneCh,用于等待raft group应用完成,其中result就是eval之后的raftcommand。
proposal与raft group
proposal提交给raft group
pkg/storage/replica.go
|
|
insertProposalLocked
将proposal设置到replica的proposal map中,以备后面使用。
最后调用raftGroup.Propose(encode(p.idKey, data)
给raft group提交propose。
执行线程挂起
|
|
执行线程等待proposal.doneCh.
raft group Ready,执行Raft Command
pkg/storage/store.go
|
|
pkg/storage/replica.go
|
|
processRaftCommand
执行command, 唤醒client wait doneChannel
|
|
proposal.finishRaftApplication
向doneCh中写入数据,唤醒客户线程的channel等待.
applyRaftCommand
写入rocksdb,并commit.
applyRaftCommand真正向rocksdb写入数据
|
|
此处Commit真正提交数据.