Transaction

Definition

After creating the database connection, we use the database connection to create a transaction manager.

Transaction management in GoooQo is accomplished through the cooperation of TransactionManager and TransactionContext (TC for short).

package core

import (
	"context"
	"database/sql/driver"
)

type TransactionManager interface {
	GetClient() any
	StartTransaction(ctx context.Context) (TransactionContext, error)
	SubmitTransaction(ctx context.Context, callback func(tc TransactionContext) error) error
}

type TransactionContext interface {
	context.Context
	driver.Tx
	Parent() context.Context
	SavePoint(name string) error
	RollbackTo(name string) error
}

The method TransactionManager#StartTransaction is responsible for starting a transaction and returning TC; TC combines driver.Tx and is responsible for transaction commit and rollback.

The TxDataAccess interface combines TransactionManager and DataAccess, which can conveniently manage transactions while providing the database operations.

type TxDataAccess[E Entity] interface {
	TransactionManager
	DataAccess[E]
}

Usages

Use StartTransaction to start a transaction and manually commit or rollback the transaction:

tc, err := userDataAccess.StartTransaction(ctx)
userQuery := UserQuery{ScoreLt: P(80)}
cnt, err := userDataAccess.DeleteByQuery(tc, userQuery)
if err != nil {
	err = RollbackFor(tc, err)
	return 0
}
err = tc.Commit()
return cnt

Or use SubmitTransaction to submit the transaction via callback:

err := tm.SubmitTransaction(ctx, func(tc TransactionContext) (err error) {
    // transaction body
    return
})

Last updated