代碼:
package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) //GO鏈接MySql var Db *sql.DB //連接池對象 func initDB() (err error) { dsn := "username:password@tcp(127.0.0.1:3306)/database?charset=utf8" db, err := sql.Open("mysql", dsn) if err != nil { return err } err = db.Ping() if err != nil { return err } //設置數據庫連接池最大連接數 db.SetMaxOpenConns(10) //設置最大鏈接空閑數 db.SetMaxIdleConns(5) Db = db return nil } type User struct { Id int Name string Age int } //查詢 func query(where string) { sqlStr := "select Id,Name,Age from User " + where + ";" //執行 rows, err := Db.Query(sqlStr) if err != nil { fmt.Printf("查詢錯誤:%v\n", err) return } //釋放連接 defer rows.Close() for rows.Next() { var u User //賦值並關閉鏈接(Scan方法) err := rows.Scan(&u.Id, &u.Name, &u.Age) if err != nil { fmt.Println("查詢循環錯誤") continue } fmt.Printf("Id:%v;Name:%v;Age:%v;\n", u.Id, u.Name, u.Age) } } func transactionDemo() { //開啟十五 tx, err := Db.Begin() if err != nil { if tx != nil { //回滾 tx.Rollback() } fmt.Printf("開啟事務失敗,錯誤:%v\n", err) return } sqlStr1 := "Update User Set age = 100 where Id=?" _, err = tx.Exec(sqlStr1, 3) if err != nil { tx.Rollback() fmt.Printf("執行sqlStr1失敗,錯誤:%v\n", err) return } sqlStr2 := "Update User Set age = 150 where Id=?" _, err = tx.Exec(sqlStr2, 4) if err != nil { tx.Rollback() fmt.Printf("執行sqlStr2失敗,錯誤:%v\n", err) return } //提交事務 err = tx.Commit() if err != nil { tx.Rollback() fmt.Printf("提交失敗,錯誤:%v\n", err) return } fmt.Println("事務執行成功") } func main() { err := initDB() if err != nil { fmt.Printf("初始化失敗,錯誤%v\n", err) return } fmt.Println("數據庫鏈接成功。") fmt.Println("-----------------------------------") query("where id > 0") transactionDemo() fmt.Println("-----------------------------------") query("where id > 0") }
結果:
參考:https://www.bilibili.com/video/BV1fz4y1m7Pm?p=137