MySQL資料庫6:Go與MySQL事務
事務概念
- 事務是將批量增刪改操作視為一個整體,作為一個整體,它們要麼全部成功,要麼全部失敗——這一特性稱為事務的原子性(原子是不可再分割的);
- 事務的應用場景很多,例如在一次電商的交易中,只有資金出入表、物流表、交易記錄表、訂單表、購物車表等一系列表的資料變動全部嚴絲合縫分毫不差時,才能視為交易成功,此時可以提交事務;
- 只要有一點對不上號的地方,本次交易就不能視為成功,所有的資料應全部回滾至交易之前的狀態;
核心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
相關文章
- MySQL(一):MySQL資料庫事務與鎖MySql資料庫
- 資料庫事務與 MySQL 事務總結資料庫MySql
- 重新學習MySQL資料庫6:淺談MySQL的中事務與鎖MySql資料庫
- 資料庫對比系列之三(PG事務與MySQL事務)資料庫MySql
- MySQL資料庫本地事務原理MySql資料庫
- MySQL資料庫5:Go與MySQL的互動MySql資料庫Go
- 【MySQL】資料庫事務深入分析MySql資料庫
- 【6】MySQL資料庫MySql資料庫
- MySQL資料庫詳解(三)MySQL的事務隔離剖析MySql資料庫
- Mysql資料庫之多表查詢、事務、DCLMySql資料庫
- MySQL事務與鎖MySql
- MySQL資料庫事務隔離性的實現MySql資料庫
- MySQL資料庫引擎、事務隔離級別、鎖MySql資料庫
- MySQL 資料庫-索引注意事項MySql資料庫索引
- MySQL事務與併發MySql
- mysql之鎖與事務MySql
- 資料庫篇:mysql事務原理之MVCC檢視+鎖資料庫MySqlMVC
- C# 從程式碼入門 Mysql 資料庫事務C#MySql資料庫
- MySQL資料庫的事務處理用法與例項程式碼詳解MySql資料庫
- MySQL資料庫遷移與MySQL資料庫批量恢復MySql資料庫
- MySQL資料庫學習筆記02(事務控制,資料查詢)MySql資料庫筆記
- MySQL資料庫與Nacos搭建監控服務MySql資料庫
- Go 語言操作 MySQL 之 事務操作GoMySql
- 成為MySQL DBA後,再看ORACLE資料庫(十、事務與隔離級別)MySqlOracle資料庫
- MySQL InnoDB資料庫如何保證事務特性示例詳解MySql資料庫
- MySQL資料庫分散式事務XA的實現原理分析MySql資料庫分散式
- 【Mysql】資料庫事務,髒讀、幻讀、不可重複讀MySql資料庫
- MySQL之資料庫儲存引擎及事務ACID特性MySql資料庫儲存引擎
- MySQL事務資料庫(InnoDB型別)的安裝方法(轉)MySql資料庫型別
- Go語言中mysql資料庫操作(一)GoMySql資料庫
- mySQL多表查詢與事務MySql
- MySQL入門--事務與鎖MySql
- mysql鎖與事務總結MySql
- mysql 事務MySql
- mysql事務MySql
- 庫存-Mysql中的事務、鎖與儲存引擎MySql儲存引擎
- 資料庫事務與事務的隔離級別資料庫
- MySQL 資料庫設計和注意事項MySql資料庫