blob: 4059e05fcd0743d41f53e1fc9a5fd5c92bca3f96 [file] [log] [blame]
package lock
import (
"github.com/dk-lockdown/seata-golang/common"
"github.com/dk-lockdown/seata-golang/tc/session"
"strings"
)
type RowLock struct {
Xid string
TransactionId int64
BranchId int64
ResourceId string
TableName string
Pk string
RowKey string
Feature string
}
func collectRowLocksByBranchSession(branchSession *session.BranchSession) []*RowLock {
if branchSession == nil || branchSession.LockKey == "" {
return nil
}
return collectRowLocks(branchSession.LockKey,branchSession.ResourceId,branchSession.Xid,branchSession.TransactionId,branchSession.BranchId)
}
func collectRowLocksByLockKeyResourceIdXid(lockKey string,
resourceId string,
xid string) []*RowLock {
return collectRowLocks(lockKey,resourceId,xid,common.XID.GetTransactionId(xid),0)
}
func collectRowLocks(lockKey string,
resourceId string,
xid string,
transactionId int64,
branchId int64) []*RowLock {
var locks = make([]*RowLock,0)
tableGroupedLockKeys := strings.Split(lockKey,";")
for _, tableGroupedLockKey := range tableGroupedLockKeys {
idx := strings.Index(tableGroupedLockKey,":")
if idx < 0 { return nil }
tableName := tableGroupedLockKey[0:idx]
mergedPKs := tableGroupedLockKey[idx+1:]
if mergedPKs == "" { return nil }
pks := strings.Split(mergedPKs,",")
if len(pks) == 0 { return nil }
for _,pk := range pks {
if pk != "" {
rowLock := &RowLock{
Xid: xid,
TransactionId: transactionId,
BranchId: branchId,
ResourceId: resourceId,
TableName: tableName,
Pk: pk,
}
locks = append(locks,rowLock)
}
}
}
return locks
}