you are better than you think

pg.v4和sharding.v4之Transaction使用小结

· by thur · Read in about 1 min · (87 Words)
golang pg.v4 sharding.v4
type User struct{
TableName string `sql:"user_?SHARD"`
...
}

postgres中user表按uid进行sharding存储。这样会有16张表user_0到user_f。pg.v4 中关于事务可以使用 方法一和方法二

方法一

err := getDB().RunInTransaction(func(tx *pg.Tx) error {
    q := fmt.Sprintf("INSERT INTO user_%s (id,x,x,x) VALUES(default,y,y,y) RETURNING *",shard_str)
    _, err := this.shard().QueryOne(this,q,this)
    return err
})

方法二

u:= &User{}
tx, err := this.shard().Begin()
if err != nil {
    if tx != nil {
    tx.Rollback()
}
    return err
}
err = orm.NewQuery(tx, this).Models(this).Create()
if err != nil {
    tx.Rollback()
}
...
tx.Commit()

方法一缺点是要自己拼出完整的sql语句,方法二的缺点是要自己控制rollback或者commit的条件。比较而言,方法一更靠谱,有问题更好排查些。

当时使用方法一/方法二的时候是因为sharding.v4还不支持runintransaction, sharding.v4从20160524以后就支持了runintransaction

方法三

err := this.shard().RunInTransaction(func(tx *sharding.Tx) error {
    _, err = tx.Model(this).Create()
    return err
})

时刻保持关注所使用的库的更新哦。

Comments