关于事务失败不回滚 #15

Closed
opened 2016-07-27 09:38:31 +00:00 by lunny · 2 comments
Owner

Author: @xubing

我在用事务的时候,第一条插入成功,第二条插入失败的时候,执行回滚后,第一条数据还在。

我这个测试的时候,使用的是postgresql,其中定义了一个json字段。执行的错误提示是json字段错误。
下面是测试代码。如果我把
user := User{Id:login.Id } 换成
user := User{Id:login.Id ,Photos:"[]"}都可以插入成功。

`
package main
import (

"github.com/go-xorm/xorm"
_ "github.com/lib/pq"
"fmt"

"github.com/xormplus/core"

"time"

)

type Login struct {
Id int64 xorm:"not null pk autoincr INTEGER"
CreatedAt time.Time xorm:"TIMESTAMPZ created "
Name string
}

type User struct {
Id int64 xorm:"not null pk INTEGER"
Photos string xorm:"JSON"
}

//xorm
func main() {

FFDB,err := xorm.NewEngine("postgres", "dbname=Test sslmode=disable")
if err != nil {
    panic("failed to connect database")
}

FFDB.ShowSQL(true)
FFDB.SetMapper(core.SameMapper{})
//sync db
err = FFDB.Sync2(&User{},&Login{})
if err != nil {
    panic("failed to sync")
}
fmt.Println("db open db successfully and sync ok")

session := FFDB.NewSession()
defer  session.Close()

login := Login{Name:"TestName"}
_,err = session.InsertOne(&login)
if err != nil {
    session.Rollback()
    return
}

user := User{Id:login.Id }  // ,Photos:"[]"  如果添加后面的这个就可以通过
_,err = session.InsertOne(&user)
if err != nil {
    fmt.Println("error:",err)
    session.Rollback()
    return
}
err = session.Commit()
if err != nil {
    fmt.Println("Commit error:",err)
    return
}

}

`

Author: @xubing 我在用事务的时候,第一条插入成功,第二条插入失败的时候,执行回滚后,第一条数据还在。 我这个测试的时候,使用的是postgresql,其中定义了一个json字段。执行的错误提示是json字段错误。 下面是测试代码。如果我把 user := User{Id:login.Id } 换成 user := User{Id:login.Id ,Photos:"[]"}都可以插入成功。 ` package main import ( "github.com/go-xorm/xorm" _ "github.com/lib/pq" "fmt" "github.com/xormplus/core" ``` "time" ``` ) type Login struct { Id int64 `xorm:"not null pk autoincr INTEGER"` CreatedAt time.Time `xorm:"TIMESTAMPZ created "` Name string } type User struct { Id int64 `xorm:"not null pk INTEGER"` Photos string `xorm:"JSON"` } //xorm func main() { ``` FFDB,err := xorm.NewEngine("postgres", "dbname=Test sslmode=disable") if err != nil { panic("failed to connect database") } FFDB.ShowSQL(true) FFDB.SetMapper(core.SameMapper{}) //sync db err = FFDB.Sync2(&User{},&Login{}) if err != nil { panic("failed to sync") } fmt.Println("db open db successfully and sync ok") session := FFDB.NewSession() defer session.Close() login := Login{Name:"TestName"} _,err = session.InsertOne(&login) if err != nil { session.Rollback() return } user := User{Id:login.Id } // ,Photos:"[]" 如果添加后面的这个就可以通过 _,err = session.InsertOne(&user) if err != nil { fmt.Println("error:",err) session.Rollback() return } err = session.Commit() if err != nil { fmt.Println("Commit error:",err) return } ``` } `
Author
Owner

Author: @xubing

发觉事务的回滚没有用。我现在插入一条数据后,不论成功和失败,我都回滚。结果这条数,仍旧存在。
`
session := FFDB.NewSession()
login := Login{Name:"TestName"}
_,err = session.InsertOne(&login)
session.Rollback()
session.Close()

`

Author: @xubing 发觉事务的回滚没有用。我现在插入一条数据后,不论成功和失败,我都回滚。结果这条数,仍旧存在。 ` session := FFDB.NewSession() login := Login{Name:"TestName"} _,err = session.InsertOne(&login) session.Rollback() session.Close() `
Author
Owner

Author: @lunny

嗯。要先调session.Begin(),最后要调session.Commit(),Rollback()一般可以不用调,调用session.Close的时候,如果没调过session.Commit(),则Rollback()会被自动调。

Author: @lunny 嗯。要先调`session.Begin()`,最后要调`session.Commit()`,`Rollback()`一般可以不用调,调用`session.Close`的时候,如果没调过`session.Commit()`,则`Rollback()`会被自动调。
This repo is archived. You cannot comment on issues.
No Milestone
No Assignees
1 Participants
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: xorm/tests#15
No description provided.