mirror of
https://gitee.com/johng/gf
synced 2026-06-06 16:21:40 +08:00
improve transaction for package gdb
This commit is contained in:
@ -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.
|
||||
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user