- 将长时间没有提交的事务打印出来
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user