這期內容當中小編將會給大家帶來有關怎么在golang中實現mysql數據庫事務的提交與回滾,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
golang可以做服務器端開發,但golang很適合做日志處理、數據打包、虛擬機處理、數據庫代理等工作。在網絡編程方面,它還廣泛應用于web應用、API應用等領域。
用到的庫有:
"github.com/jmoiron/sqlx" _ "github.com/go-sql-driver/mysql"
事務操作是通過三個方法實現:
Begin():開啟事務
Commit():提交事務(執行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()
}補充:數據庫事務處理(go,mysql)
//數據庫連接池
var db *sql.DB
//初始化數據庫
func initDB() (err error){
fmt.Println("學習數據庫")
dsn := "usename:password@tcp(127.0.0.1:3306)/dataname"
db, err = sql.Open("mysql",dsn)
if err!=nil {
fmt.Println("打開數據庫失敗 err:",err,".dsn:",dsn)
return
}
err = db.Ping()
if err!=nil {
fmt.Println("open failed err:",err)
return
}
fmt.Println("連接數據庫成功")
//最大連接數
db.SetMaxOpenConns(10)
//設置連接池中的最大閑置連接數
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("執行成功")
//提交事務
tx.Commit()
}
func main() {
fmt.Println("mysql 002.事務處理")
initDB()
trans()
}上述就是小編為大家分享的怎么在golang中實現mysql數據庫事務的提交與回滾了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。