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 cntOr use SubmitTransaction to submit the transaction via callback:
err := tm.SubmitTransaction(ctx, func(tc TransactionContext) (err error) {
    // transaction body
    return
})Last updated
Was this helpful?