本篇文章小编给大家分享一下golang实现mysql数据库事务的提交与回滚代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
MySQL 事务主要用于处理操作量大,复杂度高的数据。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务用来管理 insert,update,delete 语句,事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
用到的库有:
"github.com/jmoiron/sqlx" _ "github.com/go-sql-driver/mysql"
事务(Transactions)
事务操作是通过三个方法实现:
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","[email protected]") 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","[email protected]") 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() }
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级