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 }