mirror of https://github.com/dtm-labs/dtm.git
csharpjavadistributed-transactionsdtmgogolangmicroservicenodejsphpdatabasesagaseatatcctransactiontransactionsxapythondistributed
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
1.1 KiB
35 lines
1.1 KiB
package dtmgrpc
|
|
|
|
import (
|
|
"github.com/yedf/dtm/dtmcli"
|
|
"google.golang.org/grpc/codes"
|
|
status "google.golang.org/grpc/status"
|
|
)
|
|
|
|
// BranchBarrier 子事务屏障
|
|
type BranchBarrier struct {
|
|
*dtmcli.BranchBarrier
|
|
}
|
|
|
|
// Call 子事务屏障,详细介绍见 https://zhuanlan.zhihu.com/p/388444465
|
|
// db: 本地数据库
|
|
// transInfo: 事务信息
|
|
// bisiCall: 业务函数,仅在必要时被调用
|
|
// 返回值:
|
|
// 如果发生悬挂,则busiCall不会被调用,直接返回错误 ErrFailure,全局事务尽早进行回滚
|
|
// 如果正常调用,重复调用,空补偿,返回的错误值为nil,正常往下进行
|
|
func (bb *BranchBarrier) Call(tx dtmcli.Tx, busiCall dtmcli.BusiFunc) (rerr error) {
|
|
err := bb.BranchBarrier.Call(tx, busiCall)
|
|
if err == dtmcli.ErrFailure {
|
|
return status.New(codes.Aborted, "user rollback").Err()
|
|
}
|
|
return err
|
|
}
|
|
|
|
// BarrierFromGrpc 从BusiRequest生成一个Barrier
|
|
func BarrierFromGrpc(in *BusiRequest) (*BranchBarrier, error) {
|
|
b, err := dtmcli.BarrierFrom(in.Info.TransType, in.Info.Gid, in.Info.BranchID, in.Info.BranchType)
|
|
return &BranchBarrier{
|
|
BranchBarrier: b,
|
|
}, err
|
|
}
|
|
|