pg.v4和sharding.v4之Transaction使用小结
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
})
时刻保持关注所使用的库的更新哦。