GO的事務操作


代碼:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM