github.com/lovung/GoCleanArchitecture@v0.0.0-20210302152432-50d91fd29f9f/app/internal/interface/persistence/rdbms/gormrepo/transaction.go (about)

     1  package gormrepo
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/lovung/GoCleanArchitecture/app/internal/appctx"
     7  	"github.com/lovung/GoCleanArchitecture/pkg/logger"
     8  
     9  	"gorm.io/gorm"
    10  )
    11  
    12  // TxnDataSQL manages the transaction by implementing the Transaction Manager interface
    13  type TxnDataSQL struct {
    14  	db *gorm.DB
    15  }
    16  
    17  // NewTxnDataSQL is the contructor function
    18  func NewTxnDataSQL(db *gorm.DB) *TxnDataSQL {
    19  	return &TxnDataSQL{
    20  		db: db,
    21  	}
    22  }
    23  
    24  // TxnBegin begin a new transaction
    25  func (tds *TxnDataSQL) TxnBegin(ctx context.Context) context.Context {
    26  	txn := tds.db.WithContext(ctx).Begin()
    27  	logger.Debugf("TxnBegin - txn pointer %p", txn)
    28  	return appctx.SetValue(ctx, appctx.TransactionContextKey, txn)
    29  }
    30  
    31  // TxnRollback rollback a transaction
    32  func (tds *TxnDataSQL) TxnRollback(ctx context.Context) (err error) {
    33  	return tds.GetTxn(ctx).(*gorm.DB).Rollback().Error
    34  }
    35  
    36  // TxnCommit commit a transaction
    37  func (tds *TxnDataSQL) TxnCommit(ctx context.Context) (err error) {
    38  	return tds.GetTxn(ctx).(*gorm.DB).Commit().Error
    39  }
    40  
    41  // GetTxn to get the current transaction of this service
    42  func (tds *TxnDataSQL) GetTxn(ctx context.Context) interface{} {
    43  	v := appctx.GetValue(ctx, appctx.TransactionContextKey)
    44  	logger.Debugf("GetTxn - txn pointer %p", v)
    45  	db, ok := v.(*gorm.DB)
    46  	if !ok {
    47  		panic("assign to *gorm.DB failed")
    48  	}
    49  	return db
    50  }