ロールバックを試す前に
サンプルコード
- db := interactor.DB.Begin() で始める
- エラーが起きたら db.Rollback() をする
- 全ての処理が終わったら db.Commit() をする
package product
import (
"github.com/psychedelicnekopunch/gin-clean-architecture/app/domain"
"github.com/psychedelicnekopunch/gin-clean-architecture/app/usecase"
)
type SampleInteractor struct {
DB usecase.DBRepository
Sample usecase.SampleRepository
Sample1 usecase.Sample1Repository
Sample2 usecase.Sample2Repository
}
func (interactor *SampleInteractor) Create(sample domain.Samples) (builtSample domain.SamplesForGet, resultStatus *ResultStatus) {
db := interactor.DB.Begin()
createdSample, err := interactor.Sample.Create(sample)
if err != nil {
db.Rollback()
return domain.SamplesForGet{}, NewResultStatus(400, err)
}
_, err := interactor.Sample1.Create(domain.Samples1{
SampleID: createdSample.ID,
})
if err != nil {
db.Rollback()
return domain.SamplesForGet{}, NewResultStatus(400, err)
}
_, err := interactor.Sample2.Create(domain.Samples2{
SampleID: createdSample.ID,
})
if err != nil {
db.Rollback()
return domain.SamplesForGet{}, NewResultStatus(400, err)
}
db.Commit()
return createdSample.BuildForGet(), NewResultStatus(201, nil)
}