MySQL資料庫6:Go與MySQL事務

尹成發表於2018-11-16

事務概念

  • 事務是將批量增刪改操作視為一個整體,作為一個整體,它們要麼全部成功,要麼全部失敗——這一特性稱為事務的原子性(原子是不可再分割的);
  • 事務的應用場景很多,例如在一次電商的交易中,只有資金出入表、物流表、交易記錄表、訂單表、購物車表等一系列表的資料變動全部嚴絲合縫分毫不差時,才能視為交易成功,此時可以提交事務;
  • 只要有一點對不上號的地方,本次交易就不能視為成功,所有的資料應全部回滾至交易之前的狀態;

核心API

//連線資料庫
db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")

//開啟事務
tx, _ := db.Begin()

//事務提交(所有增刪改全部成功時)
tx.Commit()

//事務回滾(出現錯誤時)
tx.Rollback()

匯入依賴

import (
	//執行mysql包的init方法完成資料庫引擎的載入
	_ "github.com/go-sql-driver/mysql"
	
	//匯入sqlx包
	"github.com/jmoiron/sqlx"
	"fmt"
)

一次資料操作成功的案例

  • 本例中,事務操作中的所有增刪改全部成功,最終提交事務,所有增刪改都被持久化
func main021() {
	db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")
	defer db.Close()

	//開啟事務
	tx, _ := db.Begin()

	//執行系列增刪改方法
	ret1, e1 := tx.Exec("insert into person(name,age,sex) values(?,?,?)", "鹹鴨蛋", 20, true)
	ret2, e2 := tx.Exec("delete from person where name not like ?", "%蛋")
	ret3, e3 := tx.Exec("update person set name = ? where name=?", "滷蛋", "雙黃蛋")

	//有任何錯誤都回滾事務,否則提交
	if e1 != nil || e2 != nil || e3 != nil {
		fmt.Println("事務執行失敗,e1/e2/e3=", e1, e2, e3)

		//回滾事務
		tx.Rollback()
	} else {

		//提交事務
		tx.Commit()

		ra1, _ := ret1.RowsAffected()
		ra2, _ := ret2.RowsAffected()
		ra3, _ := ret3.RowsAffected()
		fmt.Println("事務執行成功,受影響的行=", ra1+ra2+ra3)
	}
}

失敗回滾的案例

  • 本例中在修改時由於nickname欄位並不存在,因此會返回一個錯誤物件
  • 整個事務也都因此而失敗,事務回滾,所有的修改都不會入庫
func main() {
	db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")
	defer db.Close()

	//開啟事務
	tx, _ := db.Begin()

	//執行系列增刪改方法
	ret1, e1 := tx.Exec("insert into person(name,age,sex) values(?,?,?)", "松花蛋", 20, true)
	ret2, e2 := tx.Exec("delete from person where name not like ?", "%蛋")
	ret3, e3 := tx.Exec("update person set nickname = ? where name=?", "茶雞蛋", "滷蛋")

	//有任何錯誤都回滾事務,否則提交
	if e1 != nil || e2 != nil || e3 != nil {
		fmt.Println("事務執行失敗,e1/e2/e3=", e1, e2, e3)

		//回滾事務
		tx.Rollback()
	} else {

		//提交事務
		tx.Commit()

		ra1, _ := ret1.RowsAffected()
		ra2, _ := ret2.RowsAffected()
		ra3, _ := ret3.RowsAffected()
		fmt.Println("事務執行成功,受影響的行=", ra1+ra2+ra3)
	}

}

學院Go語言視訊主頁
https://edu.csdn.net/lecturer/1928

清華團隊帶你實戰區塊鏈開發
掃碼獲取海量視訊及原始碼 QQ群:721929980
在這裡插入圖片描述

相關文章