in pkg/tm/transaction_executor.go [99:151]
func begin(ctx context.Context, gc *GtxConfig) error {
switch pg := gc.Propagation; pg {
case NotSupported:
// If transaction is existing, suspend it
// return then to execute without transaction
if IsGlobalTx(ctx) {
// because each global transaction operation will use a new context,
// there is no need to implement a suspend operation, just unbind the xid here.
// the same is true for the following case that needs to be suspended.
UnbindXid(ctx)
}
return nil
case Supports:
// if transaction is not existing, return then to execute without transaction
// else beginNewGtx transaction then return
if IsGlobalTx(ctx) {
useExistGtx(ctx, gc)
}
return nil
case RequiresNew:
// if transaction is existing, suspend it, and then Begin beginNewGtx transaction.
if IsGlobalTx(ctx) {
UnbindXid(ctx)
}
case Required:
// default case, If current transaction is existing, execute with current transaction,
// else continue and execute with beginNewGtx transaction.
if IsGlobalTx(ctx) {
useExistGtx(ctx, gc)
return nil
}
case Never:
// if transaction is existing, throw exception.
if IsGlobalTx(ctx) {
return fmt.Errorf("existing transaction found for transaction marked with pg 'never', xid = %s", GetXID(ctx))
}
// return then to execute without transaction.
return nil
case Mandatory:
// if transaction is not existing, throw exception.
// else execute with current transaction.
if IsGlobalTx(ctx) {
useExistGtx(ctx, gc)
return nil
}
return fmt.Errorf("no existing transaction found for transaction marked with pg 'mandatory'")
default:
return fmt.Errorf("not supported propagation:%d", pg)
}
// the follow will to construct a new transaction with xid.
return beginNewGtx(ctx, gc)
}