@ -55,14 +55,6 @@ func BarrierFrom(transType, gid, branchID, op string) (*BranchBarrier, error) {
return ti , nil
}
func insertBarrier ( tx DB , transType string , gid string , branchID string , op string , barrierID string , reason string ) ( int64 , error ) {
if op == "" {
return 0 , nil
}
sql := dtmimp . GetDBSpecial ( ) . GetInsertIgnoreTemplate ( dtmimp . BarrierTableName + "(trans_type, gid, branch_id, op, barrier_id, reason) values(?,?,?,?,?,?)" , "uniq_barrier" )
return dtmimp . DBExec ( tx , sql , transType , gid , branchID , op , barrierID , reason )
}
// Call see detail description in https://en.dtm.pub/practice/barrier.html
// tx: local transaction connection
// busiCall: busi func
@ -74,12 +66,12 @@ func (bb *BranchBarrier) Call(tx *sql.Tx, busiCall BarrierBusiFunc) (rerr error)
return tx . Rollback ( )
} )
originOp := map [ string ] string {
BranchCancel : Branch Try,
BranchCompensate : Branch Action,
dtmimp . OpCancel : dtmimp . Op Try,
dtmimp . OpCompensate : dtmimp . Op Action,
} [ bb . Op ]
originAffected , oerr := i nsertBarrier( tx , bb . TransType , bb . Gid , bb . BranchID , originOp , bid , bb . Op )
currentAffected , rerr := i nsertBarrier( tx , bb . TransType , bb . Gid , bb . BranchID , bb . Op , bid , bb . Op )
originAffected , oerr := dtmimp . I nsertBarrier( tx , bb . TransType , bb . Gid , bb . BranchID , originOp , bid , bb . Op )
currentAffected , rerr := dtmimp . I nsertBarrier( tx , bb . TransType , bb . Gid , bb . BranchID , bb . Op , bid , bb . Op )
logger . Debugf ( "originAffected: %d currentAffected: %d" , originAffected , currentAffected )
if rerr == nil && bb . Op == dtmimp . MsgDoOp && currentAffected == 0 { // for msg's DoAndSubmit, repeated insert should be rejected.
@ -90,7 +82,7 @@ func (bb *BranchBarrier) Call(tx *sql.Tx, busiCall BarrierBusiFunc) (rerr error)
rerr = oerr
}
if ( bb . Op == Branch Cancel || bb . Op == Branch Compensate) && originAffected > 0 || // null compensate
if ( bb . Op == dtmimp . Op Cancel || bb . Op == dtmimp . Op Compensate) && originAffected > 0 || // null compensate
currentAffected == 0 { // repeated request or dangled request
return
}
@ -111,13 +103,13 @@ func (bb *BranchBarrier) CallWithDB(db *sql.DB, busiCall BarrierBusiFunc) error
// QueryPrepared queries prepared data
func ( bb * BranchBarrier ) QueryPrepared ( db * sql . DB ) error {
_ , err := i nsertBarrier( db , bb . TransType , bb . Gid , dtmimp . MsgDoBranch0 , dtmimp . MsgDoOp , dtmimp . MsgDoBarrier1 , "rollback" )
_ , err := dtmimp . I nsertBarrier( db , bb . TransType , bb . Gid , dtmimp . MsgDoBranch0 , dtmimp . MsgDoOp , dtmimp . MsgDoBarrier1 , dtmimp . OpRollback )
var reason string
if err == nil {
sql := fmt . Sprintf ( "select reason from %s where gid=? and branch_id=? and op=? and barrier_id=?" , dtmimp . BarrierTableName )
err = db . QueryRow ( sql , bb . Gid , dtmimp . MsgDoBranch0 , dtmimp . MsgDoOp , dtmimp . MsgDoBarrier1 ) . Scan ( & reason )
}
if reason == "rollback" {
if reason == dtmimp . OpRollback {
return ErrFailure
}
return err