improve transaction for package gdb

This commit is contained in:
John Guo
2021-05-19 20:33:19 +08:00
parent fac9ab5c01
commit ab2ef13d99
3 changed files with 39 additions and 10 deletions

View File

@ -84,6 +84,7 @@ type DB interface {
Insert(table string, data interface{}, batch ...int) (sql.Result, error) // See Core.Insert.
InsertIgnore(table string, data interface{}, batch ...int) (sql.Result, error) // See Core.InsertIgnore.
InsertAndGetId(table string, data interface{}, batch ...int) (int64, error) // See Core.InsertAndGetId.
Replace(table string, data interface{}, batch ...int) (sql.Result, error) // See Core.Replace.
Save(table string, data interface{}, batch ...int) (sql.Result, error) // See Core.Save.

View File

@ -11,11 +11,12 @@ import (
"context"
"database/sql"
"fmt"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/text/gstr"
"reflect"
"strings"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/text/gstr"
"github.com/gogf/gf/internal/utils"
"github.com/gogf/gf/container/gvar"
@ -387,15 +388,34 @@ func (c *Core) Begin() (*TX, error) {
// ctx, cancelFunc = context.WithTimeout(ctx, c.GetConfig().TranTimeout)
// defer cancelFunc()
//}
if tx, err := master.Begin(); err == nil {
var (
sqlStr = "BEGIN"
mTime1 = gtime.TimestampMilli()
rawTx, err = master.Begin()
mTime2 = gtime.TimestampMilli()
sqlObj = &Sql{
Sql: sqlStr,
Type: "DB.Begin",
Args: nil,
Format: sqlStr,
Error: err,
Start: mTime1,
End: mTime2,
Group: c.db.GetGroup(),
}
)
c.db.addSqlToTracing(c.db.GetCtx(), sqlObj)
if c.db.GetDebug() {
c.db.writeSqlToLogger(sqlObj)
}
if err == nil {
return &TX{
db: c.db,
tx: tx,
tx: rawTx,
master: master,
}, nil
} else {
return nil, err
}
return nil, err
}
}
@ -464,6 +484,14 @@ func (c *Core) InsertIgnore(table string, data interface{}, batch ...int) (sql.R
return c.Model(table).Data(data).InsertIgnore()
}
// InsertAndGetId performs action Insert and returns the last insert id that automatically generated.
func (c *Core) InsertAndGetId(table string, data interface{}, batch ...int) (int64, error) {
if len(batch) > 0 {
return c.Model(table).Data(data).Batch(batch[0]).InsertAndGetId()
}
return c.Model(table).Data(data).InsertAndGetId()
}
// Replace does "REPLACE INTO ..." statement for the table.
// If there's already one unique record of the data in the table, it deletes the record
// and inserts a new one.

View File

@ -8,9 +8,10 @@ package gdb_test
import (
"fmt"
"testing"
"github.com/gogf/gf/database/gdb"
"github.com/gogf/gf/errors/gerror"
"testing"
"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/os/gtime"
@ -119,7 +120,7 @@ func Test_TX_Insert(t *testing.T) {
if err != nil {
gtest.Error(err)
}
user := tx.Table(table)
user := tx.Model(table)
if _, err := user.Data(g.Map{
"id": 1,
"passport": "t1",
@ -129,7 +130,6 @@ func Test_TX_Insert(t *testing.T) {
}).Insert(); err != nil {
gtest.Error(err)
}
if _, err := tx.Insert(table, g.Map{
"id": 2,
"passport": "t1",
@ -140,7 +140,7 @@ func Test_TX_Insert(t *testing.T) {
gtest.Error(err)
}
if n, err := tx.Table(table).Count(); err != nil {
if n, err := tx.Model(table).Count(); err != nil {
gtest.Error(err)
} else {
t.Assert(n, 2)