開発プロセス中に、複雑なビジネス ロジックを処理する必要がある状況に遭遇することがよくあります。この時期、物事は非常に重要になります。Gorm は優れた ORM フレームワークであり、データベースを操作するための便利な方法を多数提供します。この記事では、Gorm のネストされたトランザクションと SavePoint/RollbackTo トランザクションに焦点を当てます。
- ネストされたトランザクション
実際のアプリケーションでは、複雑な問題を解決するためにネストされたトランザクションを使用する必要がある場合があります。いわゆるネストされたトランザクションは、外部トランザクション内で複数の内部サブトランザクションを実行することです。すべてのサブトランザクションが正常にコミットされると、外側のトランザクション全体がコミットされます。
Gorm は、ネストされたトランザクション操作をサポートするために、Begin
や などのメソッドを提供しますRollback
。以下に例を示します。
func UpdateOrder(order *model.Order) error {
tx := db.Begin()
if err := tx.Error; err != nil {
return err
}
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Save(order).Error; err != nil { // 外层事物
tx.Rollback()
return err
}
for _, detail := range order.Details { // 内层事物
if err := tx.Save(detail).Error; err != nil {
tx.Rollback()
return err
}
}
return tx.Commit().Error
}
この例では、最初に外部トランザクションを開きますtx.Begin()
。次に、各内部サブトランザクションを実行した後、エラーがあるかどうかを確認し、エラーがある場合は、ネストされたトランザクション全体をロールバックする必要があります。最後に、すべての内部サブトランザクションが正常にコミットされた後、外部トランザクション全体をコミットします。
- SavePoint/RollbackTo トランザクション
Gorm は、よりきめ細かいトランザクション制御をサポートするための SavePoint メソッドと RollbackTo メソッドも提供します。特定の操作の実行中に現在のトランザクションを一時停止し、次の操作が完了した後に元の状態に戻したい場合は、SavePoint メソッドと RollbackTo メソッドを使用できます。
例えば:
func UpdateOrder(order *model.Order) error {
var sp string
tx := db.Begin()
if err := tx.Error; err != nil {
return err
}
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Save(order).Error; err != nil { // 外层事物
tx.Rollback()
return err
}
sp = "savepoint_a"
if err := tx.Exec(fmt.Sprintf("SAVEPOINT %s", sp)).Error; err != nil { // 保存现场A
tx.Rollback()
return err
}
if err := tx.Save(&model.Detail{OrderID: order.ID}).Error; err != nil { // 内层事物A
tx.Exec(fmt.Sprintf("ROLLBACK TO %s", sp)) // 回滚到现场A
return err
}
if err := tx.Save(&model.Detail{OrderID: order.ID}).Error; err != nil { // 内层事物B
tx.Rollback()
return err
}
if err := tx.Exec(fmt.Sprintf("RELEASE SAVEPOINT %s", sp)).Error; err != nil { // 提交现场A的修改
tx.Rollback()
return err
}
for _, detail := range order.Details {
if err := tx.Save(detail).Error; err != nil {
tx.Rollback()
return err
}
}
return tx.Commit().Error
}
この例では、最初に外部トランザクションを開きます。次に、いくつかの操作を実行した後、 を使用してSAVEPOINT
現在の状態を保存します。次に、内部サブトランザクションを実行してエラーをチェックします。エラーが発生した場合は、保存された SavePoint にロールバックする必要があります。
いくつかの操作が完了したら、RELEASE SAVEPOINT
ステートメントを使用して、SavePoint に保存された状態を送信できます。
要約する
Gorm は非常に優れた ORM フレームワークであり、データベースを操作するための便利な方法を多数提供します。この記事では主にGormのネストトランザクションとSavePoint/RollbackToトランザクションに関する内容を紹介します。
これらのメソッドを使用すると、トランザクションの実行プロセスをより柔軟に制御できるようになり、複雑なビジネス ロジックをより適切に処理できるようになります。もちろん、実際のアプリケーションでは、最良の結果を達成するために、特定の状況に応じて柔軟に使用する必要もあります。