Skip to content

Instantly share code, notes, and snippets.

@valterlobo
Last active May 7, 2022 17:06
Show Gist options
  • Save valterlobo/491ebdfe4cc76a85efb14ca6b9116131 to your computer and use it in GitHub Desktop.
Save valterlobo/491ebdfe4cc76a85efb14ca6b9116131 to your computer and use it in GitHub Desktop.
Golang Transaction - Duvidas em pseudo-código
func criarDado(sql.Tx, ctx, dado Dado) (error) {
}
func criarItem(sql.Tx, ctx, item Item) (error) {
}
pedido ( dado:Dado, itens:[]Item )
func cadastrarPedido(pedido) (error) {
ctx := context.Background()
tx, err := sql.DB.BeginTx(ctx, nil)
errorDado := criarDado(tx, ctx, pedido.dado)
if errorDado != nil {
tx.Rollback()
return errorDado
}
para cada item no pedido.itens{
errorItem := criarItem ( tx, ctx, item )
if errorItem != nil{
tx.Rollback()
return errorItem
}
}
tx.Commit()
}
@valterlobo
Copy link
Author

@valterlobo
Copy link
Author

valterlobo commented May 7, 2022

func GetDB () sql.DB

db, err := sql.Open("mysql",
"user:password@tcp(127.0.0.1:3306)/hello")
if err != nil {
log.Fatal(err)
}
return db
}

type Repository struct {
db *sql.DB
}

func NewRepository(db *sql.DB) Repository {

repo := &Repository{
	db:   db,
}
return repo

}

func (r Repository ) Save(d Data ) {

tx, err := r.db.BeginTx(ctx, nil)
if err != nil {
return fail(err)
}
// Defer a rollback in case anything fails.
defer tx.Rollback()

result, err := tx.ExecContext(ctx, "INSERT INTO XXXXXX (id, field ) VALUES (?, ?)",
data.ID, data.Field)
if err != nil {
return fail(err)
}
// Get the ID of the order item just created.
orderID, err := result.LastInsertId()
if err != nil {
return fail(err)
}

  _, err = tx.ExecContext(ctx, "UPDATE XXXXXX SET field_date =  ? WHERE id = ?",
    data.GetDate(), data.ID)

// Commit the transaction.
if err = tx.Commit(); err != nil {
    return fail(err)
}

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment