0

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 メソッドで渡されるトランザクションの値は何でしょうか?

または、それを行うためのより良い方法があります。誰か助けてくれませんか?

4

1 に答える 1