package main
import ( "fmt" "github.com/jmoiron/sqlx" _ "github.com/go-sql-driver/mysql" // MySQL driver "log")
// createDBConnection 创建并返回一个数据库连接func createDBConnection() (*sqlx.DB, error) { // 数据库连接字符串 dsn := "username:password@tcp(127.0.0.1:3306)/mydb?parseTime=true" return sqlx.Connect("mysql", dsn) // 使用 sqlx 连接到 MySQL 数据库}
// performTransaction 执行一个数据库事务func performTransaction(db *sqlx.DB) error { // 开始一个新的事务 tx, err := db.Beginx() if err != nil { return err // 如果开始事务失败,返回错误 }
// 使用 defer 确保在结束时正确处理事务 defer func() { if p := recover(); p != nil { // 如果发生 panic,则回滚事务 tx.Rollback() panic(p) // 重新抛出 panic,以便上层调用处理 } else if err != nil { // 如果发生错误,回滚事务 fmt.Println("Rollback due to error:", err) tx.Rollback() } else { // 如果没有错误,提交事务 fmt.Println("Committing transaction") err = tx.Commit() } }()
// 示例:插入用户 _, err = tx.Exec("INSERT INTO users(name) VALUES(?)", "John Doe") if err != nil { return err // 记录插入失败,返回错误 }
// 示例:插入订单 _, err = tx.Exec("INSERT INTO orders(user_id, amount) VALUES(?, ?)", 1, 100.0) if err != nil { return err // 记录插入失败,返回错误 }
return nil // 如果没有错误,返回 nil}
func main() { // 创建数据库连接 db, err := createDBConnection() if err != nil { log.Fatalf("Failed to connect to database: %v", err) // 连接失败,日志记录并退出 } defer db.Close() // 确保在主函数结束时关闭数据库连接
// 执行事务并处理结果 if err := performTransaction(db); err != nil { log.Printf("Transaction failed: %v\n", err) // 事务失败,记录错误 } else { log.Println("Transaction succeeded!") // 事务成功,日志记录 }}
评论