- 将长时间没有提交的事务打印出来

This commit is contained in:
gazebo
2019-09-21 17:31:44 +08:00
parent 61dcd6db6f
commit b5e28a280f

View File

@@ -3,6 +3,8 @@ package dao
import ( import (
"errors" "errors"
"reflect" "reflect"
"runtime/debug"
"time"
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals"
@@ -11,11 +13,15 @@ import (
const ( const (
useGetRowsWhenGetRow = true useGetRowsWhenGetRow = true
transactionWarningSeconds = 5 * 60 // 5分钟
) )
type DaoDB struct { type DaoDB struct {
transactionLevel int transactionLevel int
Db orm.Ormer Db orm.Ormer
transactionWatchTimer *time.Timer
beginTransactionStack []byte
} }
// func GetRows(db *gorm.DB, inPtr interface{}, sql string, values ...interface{}) (err error) { // 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) { func Begin(db *DaoDB) (err error) {
if db.transactionLevel == 0 { if db.transactionLevel == 0 {
err = db.Db.Begin() err = db.Db.Begin()
if err == nil {
db.startWatchTransaction()
}
} }
db.transactionLevel++ db.transactionLevel++
return err 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) { func Commit(db *DaoDB) (err error) {
if db.transactionLevel == 1 { if db.transactionLevel == 1 {
db.stopWatchTransaction()
err = db.Db.Commit() err = db.Db.Commit()
db.transactionLevel = 0 db.transactionLevel = 0
} else if db.transactionLevel > 1 { } else if db.transactionLevel > 1 {
@@ -79,6 +107,8 @@ func Commit(db *DaoDB) (err error) {
func Rollback(db *DaoDB) (err error) { func Rollback(db *DaoDB) (err error) {
if db.transactionLevel > 0 { if db.transactionLevel > 0 {
db.stopWatchTransaction()
err = db.Db.Rollback() err = db.Db.Rollback()
} }
db.transactionLevel = 0 db.transactionLevel = 0