72 lines
1016 B
Go
72 lines
1016 B
Go
package dualtrx_helper
|
|
|
|
import (
|
|
dg "github.com/karincake/apem/db-gorm-pg"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type Dualtx struct {
|
|
Sync *gorm.DB
|
|
Simgos *gorm.DB
|
|
Satu *gorm.DB
|
|
}
|
|
|
|
func NewDualtx() *Dualtx {
|
|
simgosTx := dg.IS["simrs"].Begin()
|
|
simgosTx.Exec(`SET LOCAL simx.sync_source = 'new'`)
|
|
|
|
return &Dualtx{
|
|
Sync: dg.I.Begin(),
|
|
Simgos: simgosTx,
|
|
}
|
|
}
|
|
|
|
func NewTx() *Dualtx {
|
|
return &Dualtx{
|
|
Sync: dg.I,
|
|
Simgos: dg.IS["simrs"],
|
|
Satu: dg.IS["satu"],
|
|
}
|
|
}
|
|
|
|
func (t *Dualtx) Commit() error {
|
|
if err := t.Sync.Commit().Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := t.Simgos.Commit().Error; err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (t *Dualtx) Rollback() {
|
|
t.Sync.Rollback()
|
|
t.Simgos.Rollback()
|
|
}
|
|
|
|
type DualTxFunc func(tx *Dualtx) error
|
|
|
|
func WithDualTx(fn DualTxFunc) error {
|
|
var (
|
|
tx = NewDualtx()
|
|
err error
|
|
)
|
|
|
|
defer func() {
|
|
if err != nil {
|
|
tx.Rollback()
|
|
}
|
|
}()
|
|
|
|
if err = fn(tx); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = tx.Commit(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|