MySQL 事務(wù)主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務(wù)。
事務(wù)用來管理 insert,update,delete 語句,事務(wù)處理可以用來維護數(shù)據(jù)庫的完整性,保證成批的 SQL 語句要么全部執(zhí)行,要么全部不執(zhí)行。
一般來說,事務(wù)是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
本文主要介紹golang實現(xiàn)MySQL數(shù)據(jù)庫事物的提交與回滾
用到的庫有:
"github.com/jmoiron/sqlx"
_ "github.com/go-sql-driver/mysql"
事務(wù)(Transactions)
事務(wù)操作是通過三個方法實現(xiàn):
Begin():開啟事務(wù)
Commit():提交事務(wù)(執(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ù)庫事務(wù)處理(go,mysql)
看代碼吧~
//數(shù)據(jù)庫連接池
var db *sql.DB
//初始化數(shù)據(jù)庫
func initDB() (err error){
fmt.Println("學(xué)習(xí)數(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è)置連接池中的最大閑置連接數(shù)
db.SetMaxIdleConns(10)
return
}
func trans() {
tx, err := db.Begin()
if err!=nil {
fmt.Println("事務(wù)開啟失敗, 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í)行成功")
//提交事務(wù)
tx.Commit()
}
func main() {
fmt.Println("mysql 002.事務(wù)處理")
initDB()
trans()
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- mysql創(chuàng)建表添加字段注釋的實現(xiàn)方法
- MySQL之存儲過程按月創(chuàng)建表的方法步驟
- mysql創(chuàng)建表的sql語句詳細總結(jié)
- Hibernate4在MySQL5.1以上版本創(chuàng)建表出錯 type=InnDB
- 詳解在MySQL中創(chuàng)建表的教程
- MySQL動態(tài)創(chuàng)建表,數(shù)據(jù)分表的存儲過程
- MYSQL建立外鍵失敗幾種情況記錄Can''t create table不能創(chuàng)建表
- IDEA連接mysql數(shù)據(jù)庫報錯的解決方法
- django將圖片保存到mysql數(shù)據(jù)庫并展示在前端頁面的實現(xiàn)
- MySQL安裝后默認自帶數(shù)據(jù)庫的作用詳解
- python3 實現(xiàn)mysql數(shù)據(jù)庫連接池的示例代碼
- mysql數(shù)據(jù)庫入門第一步之創(chuàng)建表