欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang實現(xiàn)mysql數(shù)據(jù)庫事務的提交與回滾

 更新時間:2021年04月27日 11:25:48   作者:wade3015  
這篇文章主要介紹了golang實現(xiàn)mysql數(shù)據(jù)庫事務的提交與回滾,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

MySQL 事務主要用于處理操作量大,復雜度高的數(shù)據(jù)。在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務。

事務用來管理 insert,update,delete 語句,事務處理可以用來維護數(shù)據(jù)庫的完整性,保證成批的 SQL 語句要么全部執(zhí)行,要么全部不執(zhí)行。

一般來說,事務是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。

本文主要介紹golang實現(xiàn)MySQL數(shù)據(jù)庫事物的提交與回滾

用到的庫有:

"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"

事務(Transactions)

事務操作是通過三個方法實現(xiàn):

Begin():開啟事務

Commit():提交事務(執(zhí)行sql)

Rollback():回滾

舉例:

在事物里操作MySQL任意一步操作出錯,都需要Rollback()回滾。

package main 
import (
 "fmt"
 "github.com/alecthomas/log4go"
 _ "github.com/go-sql-driver/mysql"
 "github.com/jmoiron/sqlx"
)
 
var Db *sqlx.DB 
func init()  {
 db,err:=sqlx.Open("mysql","TigerwolfC:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
 if err != nil {
  fmt.Println("open mysql failed,", err)
  return
 }
 Db = db
}
 
func main()  {
 mysqlTest()
} 
 
func mysqlTest() error{
 tx, err := Db.Begin()
 if err != nil {
  log4go.Error("open mysql database fail", err)
  return err
 }
 
 result, err := tx.Exec("INSERT INTO userinfo (username, password,department,email) VALUES (?, ?,?,?)","cici","33333","it","TigerwolfC@163.com")
 if err != nil{
  fmt.Println("insert failed,error: ", err)
  tx.Rollback()
  return err
 }
 id,_ := result.LastInsertId()
 fmt.Println("insert id is :",id)
 _, err = tx.Exec("update userinfo set department = ? where username = ?","cekong","hahah")
 if err != nil{
  fmt.Println("update failed error:",err)
  tx.Rollback()
  return err
 } else {
  fmt.Println("update success!")
 }
 _, err = tx.Exec("delete from userinfo where username = ? ", "weiwei")
 if err != nil{
  fmt.Println("delete error:",err)
  tx.Rollback()
  return err
 }else{
  fmt.Println("delete success")
 }
 return tx.Commit()
}

當然也可以用defer tx.Rollback(),在程序退出前回滾。

func mysqlTest() error{
 tx, err := Db.Begin()
 if err != nil {
  log4go.Error("open mysql database fail", err)
 }
 defer tx.Rollback()
 
 result, err := tx.Exec("INSERT INTO userinfo (username, password,department,email) VALUES (?, ?,?,?)","cici","33333","it","TigerwolfC@163.com")
 if err != nil{
  fmt.Println("insert failed,error: ", err)
  return err
 }
 id,_ := result.LastInsertId()
 fmt.Println("insert id is :",id)
 _, err = tx.Exec("update userinfo set department = ? where username = ?","cekong","hahah")
 if err != nil{
  fmt.Println("update failed error:",err)
  return err
 } else {
  fmt.Println("update success!")
 }
 _, err = tx.Exec("delete from userinfo where username = ? ", "weiwei")
 if err != nil{
  fmt.Println("delete error:",err)
  return err
 }else{
  fmt.Println("delete success")
 }
 return tx.Commit()
}

補充:數(shù)據(jù)庫事務處理(go,mysql)

看代碼吧~

//數(shù)據(jù)庫連接池
var db *sql.DB
//初始化數(shù)據(jù)庫
func initDB() (err error){
	fmt.Println("學習數(shù)據(jù)庫")
	dsn := "usename:password@tcp(127.0.0.1:3306)/dataname"
	db, err = sql.Open("mysql",dsn)
	if err!=nil {
		fmt.Println("打開數(shù)據(jù)庫失敗 err:",err,".dsn:",dsn)
		return
	}
	err = db.Ping()
	if err!=nil {
		fmt.Println("open failed err:",err)
		return
	}
	fmt.Println("連接數(shù)據(jù)庫成功")
 
	//最大連接數(shù)
	db.SetMaxOpenConns(10)
	//設置連接池中的最大閑置連接數(shù)
	db.SetMaxIdleConns(10)
	return
}
 
func trans()  {
	tx, err := db.Begin()
	if err!=nil {
		fmt.Println("事務開啟失敗, err:",err)
		return
	}
	sqlStr1 := "update student set age=age-2 where id=1;"
	sqlStr2 := "update student set age=age+2 where id=3;"
	_, err = tx.Exec(sqlStr1)
	if err!=nil {
		fmt.Println("修改失敗, err",err,",sqlStr1:",sqlStr1)
		tx.Rollback()
		return
	}
 
	_, err = tx.Exec(sqlStr2)
	if err!=nil {
		fmt.Println("修改失敗, err",err,",sqlStr2:",sqlStr2)
		tx.Rollback()
		return
	}
 
	fmt.Println("執(zhí)行成功")
	//提交事務
	tx.Commit()
}
func main() {
	fmt.Println("mysql 002.事務處理")
	initDB()
	trans() 
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關文章

  • Gin golang web開發(fā)模型綁定實現(xiàn)過程解析

    Gin golang web開發(fā)模型綁定實現(xiàn)過程解析

    這篇文章主要介紹了Gin golang web開發(fā)模型綁定實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • golang框架中跨服務的最佳通信協(xié)議和工具

    golang框架中跨服務的最佳通信協(xié)議和工具

    在 go 框架中實現(xiàn)跨服務通信的最佳實踐包括使用 grpc(適用于低延遲高吞吐量)、http 客戶端(適用于 restful api)和消息隊列(適用于異步解耦通信),在選擇通信方式時,應考慮服務交互模式、性能要求和部署環(huán)境等因素
    2024-06-06
  • Golang實現(xiàn)斷點續(xù)傳功能

    Golang實現(xiàn)斷點續(xù)傳功能

    這篇文章主要為大家詳細介紹了Golang實現(xiàn)斷點續(xù)傳、復制文件功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Golang學習筆記(六):struct

    Golang學習筆記(六):struct

    這篇文章主要介紹了Golang學習筆記(六):struct,本文講解了struct的聲明及初始化、struct的匿名字段(繼承)、method、method繼承和重寫等內容,需要的朋友可以參考下
    2015-05-05
  • golang簡單獲取上傳文件大小的實現(xiàn)代碼

    golang簡單獲取上傳文件大小的實現(xiàn)代碼

    這篇文章主要介紹了golang簡單獲取上傳文件大小的方法,涉及Go語言文件傳輸及文件屬性操作的相關技巧,需要的朋友可以參考下
    2016-07-07
  • Go語言排序算法之插入排序與生成隨機數(shù)詳解

    Go語言排序算法之插入排序與生成隨機數(shù)詳解

    從這篇文章開始將帶領大家學習Go語言的經典排序算法,比如插入排序、選擇排序、冒泡排序、希爾排序、歸并排序、堆排序和快排,二分搜索,外部排序和MapReduce等,本文將先詳細介紹插入排序,并給大家分享了go語言生成隨機數(shù)的方法,下面來一起看看吧。
    2017-11-11
  • Go語言利用接口實現(xiàn)鏈表插入功能詳解

    Go語言利用接口實現(xiàn)鏈表插入功能詳解

    這篇文章主要為大家介紹了Go語言中的接口,以及如何利用接口實現(xiàn)鏈表插入功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-04-04
  • 使用Go語言編寫HTTP中間件的示例詳解

    使用Go語言編寫HTTP中間件的示例詳解

    在Go語言中,HTTP中間件是一種處理HTTP請求和響應的函數(shù),它可以攔截到請求并對其進行處理,然后再將請求傳遞給下一個中間件或目標處理程序,本文給大家介紹了使用Go語言編寫HTTP中間件的示例,文中有相關的代碼示例供大家參考,需要的朋友可以參考下
    2024-01-01
  • Golang處理parquet文件實戰(zhàn)指南

    Golang處理parquet文件實戰(zhàn)指南

    這篇文章主要給大家介紹了關于Golang處理parquet文件的相關資料,文中通過實例代碼介紹的非常詳細,對大家學習或者使用Golang具有一定的參考學習價值,需要的朋友可以參考下
    2023-03-03
  • Go 標準庫增加metrics指標探討分析

    Go 標準庫增加metrics指標探討分析

    go中有一個神奇的標準庫 runtime/metrics,提供了一系列預定義好的 Go 自身的相關指標,如果沒有編寫過基礎監(jiān)控庫或者關注的比較少的朋友可能會沒接觸到這類指標,本文展開現(xiàn)有metrics 指標,并結合現(xiàn)有的社區(qū)討論一起看看還有沒有必要增加更多的標準庫指標
    2023-10-10

最新評論