Golang アプリケーションの 1 つで、API で複数のテーブルを更新するユースケースがあり、更新の 1 つが失敗した場合、以前のすべての更新をロールバックする必要があります (Java で @Transactional が行うこと)。以下の方法でやってみました。
func (d *dao) Method1(opt string) error {
tx, err := d.DB.BeginTx(context.Background(), nil)
if err != nil {
return errors.Errorf("Unable to start transaction")
}
err := d.dao1.Update1(opt)
if err != nil {
log.Infof("Error : %s. Rolling back transaction", err)
_ = tx.Rollback()
log.Infof("Transaction rolled back while update 1")
return err
}
err = d.dao2.Update2(opt)
if err != nil {
log.Errorf("Error in making update 2 "+
"Error %v ", err)
_ = tx.Rollback()
log.Infof("Transaction rolled back while update 2")
return err
}
}
}
func(d *dao1) Update1 error {
var query = "update T1 set C1 = ? where id = ?"
_, err := d.DB.Exec(query, "v1", "v2")
return err
}
func(d *dao2) Update2 error {
var query = "update T2 set C2 = ? where id = ?"
_, err := d.DB.Exec(query, "v1", "v2")
return err
}
しかし、Update1 および Update2 メソッドで新しいトランザクションを作成しているため、これは機能しません。そこで、以下のようにメソッド Update1 & Update2 のメソッド パラメータでトランザクションを渡そうとしました。
func Update1(tx sql.Tx) error {
var query = "update T1 set C1 = ? where id = ?"
_, err := tx.Exec(query, "v1", "v2")
return err
}
しかし、問題は、メソッド Update1 だけを呼び出す必要がある場合です。その場合、Update1 メソッドで渡されるトランザクションの値は何でしょうか?
または、それを行うためのより良い方法があります。誰か助けてくれませんか?