From b5e28a280f73e0fb7dfcc02085050895375490a2 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 21 Sep 2019 17:31:44 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=B0=86=E9=95=BF=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=8F=90=E4=BA=A4=E7=9A=84=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/model/dao/dao.go | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) 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