gorm의 Transaction에 대해 얘기를 나눠보도록 하겠습니다.
2660 단어 golang
순서
본고는 주로gorm의 Transaction을 연구하고자 한다
Transaction
gorm.io/[email protected]/finisher_api.go
// Transaction start a transaction as a block, return error will rollback, otherwise to commit.
func (db *DB) Transaction(fc func(tx *DB) error, opts ...*sql.TxOptions) (err error) {
panicked := true
if committer, ok := db.Statement.ConnPool.(TxCommitter); ok && committer != nil {
// nested transaction
if !db.DisableNestedTransaction {
err = db.SavePoint(fmt.Sprintf("sp%p", fc)).Error
defer func() {
// Make sure to rollback when panic, Block error or Commit error
if panicked || err != nil {
db.RollbackTo(fmt.Sprintf("sp%p", fc))
}
}()
}
if err == nil {
err = fc(db.Session(&Session{}))
}
} else {
tx := db.Begin(opts...)
defer func() {
// Make sure to rollback when panic, Block error or Commit error
if panicked || err != nil {
tx.Rollback()
}
}()
if err = tx.Error; err == nil {
err = fc(tx)
}
if err == nil {
err = tx.Commit().Error
}
}
panicked = false
return
}
DB의 Transaction 방법은 비TxCommitter 유형의db를 대상으로 합니다.Statement.ConnPool 실행db.Begin, 이후에 defer를 등록하여 panicked 또는 err에 대한 실행 tx.Rollback (), fc를 실행한 후 err를 nil로 판단한 경우 tx.Commit (), Error를 err로 지정합니다
인스턴스
func TestInsertInTx(t *testing.T) {
err := db.Transaction(func(tx *gorm.DB) error {
classes := []model.Class{
{
Name: "abc2",
},
{
Name: "abc2",
},
}
err := db.Create(&classes).Error
if err != nil {
return err
}
uc := []model.UserClass{
{
UserId: 1,
ClassId: classes[0].ID,
},
{
UserId: 1,
ClassId: classes[1].ID,
},
}
err2 := db.Create(&uc).Error
if err2 != nil {
return err2
}
return nil
})
if err != nil {
t.Error(err)
}
}
작은 매듭
gorm의 DB는 트랜잭션 방법을 제공합니다. 하나의 사무 템플릿, 자동commit 또는rollback에 해당합니다.func(tx*gorm.DB) error 파라미터를 제공하여 사용자 정의 사무 내의 데이터베이스 작업에 사용합니다.
doc
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.