Golang にて Clean Architecture を用いた gin + GORM で rollback (ロールバック)を試す

ロールバックを試す前に

サンプルコード

  • 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)
}