diff --git a/business/model/dao/dao.go b/business/model/dao/dao.go index 257b5c067..95a41b25e 100644 --- a/business/model/dao/dao.go +++ b/business/model/dao/dao.go @@ -3,6 +3,8 @@ package dao import ( "errors" "reflect" + "runtime/debug" + "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals" @@ -10,12 +12,16 @@ import ( ) const ( - useGetRowsWhenGetRow = true + useGetRowsWhenGetRow = true + transactionWarningSeconds = 5 * 60 // 5分钟 ) type DaoDB struct { transactionLevel int Db orm.Ormer + + transactionWatchTimer *time.Timer + beginTransactionStack []byte } // func GetRows(db *gorm.DB, inPtr interface{}, sql string, values ...interface{}) (err error) { @@ -62,13 +68,35 @@ func GetDB() *DaoDB { func Begin(db *DaoDB) (err error) { if db.transactionLevel == 0 { err = db.Db.Begin() + if err == nil { + db.startWatchTransaction() + } } db.transactionLevel++ return err } +func (db *DaoDB) startWatchTransaction() { + db.beginTransactionStack = debug.Stack() + db.transactionWatchTimer = utils.AfterFuncWithRecover(transactionWarningSeconds*time.Second, func() { + globals.SugarLogger.Debugf("Begin Transaction too long, %s", string(db.beginTransactionStack)) + db.transactionWatchTimer = nil + db.beginTransactionStack = nil + }) +} + +func (db *DaoDB) stopWatchTransaction() { + if db.transactionWatchTimer != nil { + db.transactionWatchTimer.Stop() + db.transactionWatchTimer = nil + db.beginTransactionStack = nil + } +} + func Commit(db *DaoDB) (err error) { if db.transactionLevel == 1 { + db.stopWatchTransaction() + err = db.Db.Commit() db.transactionLevel = 0 } else if db.transactionLevel > 1 { @@ -79,6 +107,8 @@ func Commit(db *DaoDB) (err error) { func Rollback(db *DaoDB) (err error) { if db.transactionLevel > 0 { + db.stopWatchTransaction() + err = db.Db.Rollback() } db.transactionLevel = 0