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에 따라 라이센스가 부여됩니다.