好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > golang實現(xiàn)mysql數(shù)據(jù)庫事務(wù)的提交與回滾

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

熱門標(biāo)簽:電話機(jī)器人軟件免費(fèi) excel地圖標(biāo)注分布數(shù)據(jù) 外呼系統(tǒng)用什么卡 評價高的400電話辦理 涿州代理外呼系統(tǒng) 外呼系統(tǒng)顯本地手機(jī)號 百度地圖標(biāo)注后傳給手機(jī) 阿克蘇地圖標(biāo)注 壽光微信地圖標(biāo)注

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

事務(wù)用來管理 insert,update,delete 語句,事務(wù)處理可以用來維護(hù)數(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()
}

當(dāng)然也可以用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()
}

補(bǔ)充:數(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語句詳細(xì)總結(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安裝后默認(rèn)自帶數(shù)據(jù)庫的作用詳解
  • python3 實現(xiàn)mysql數(shù)據(jù)庫連接池的示例代碼
  • mysql數(shù)據(jù)庫入門第一步之創(chuàng)建表

標(biāo)簽:重慶 梅河口 欽州 蘭州 銅川 汕頭 吐魯番 雞西

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang實現(xiàn)mysql數(shù)據(jù)庫事務(wù)的提交與回滾》,本文關(guān)鍵詞  golang,實現(xiàn),mysql,數(shù)據(jù)庫,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang實現(xiàn)mysql數(shù)據(jù)庫事務(wù)的提交與回滾》相關(guān)的同類信息!
  • 本頁收集關(guān)于golang實現(xiàn)mysql數(shù)據(jù)庫事務(wù)的提交與回滾的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 狠狠色噜噜噜狠狠77777| 啊…嗯啊好深男男腐文肉| 亚洲熟妇色????APP| 狼友91精品一区二区三区| 啊灬啊灬啊灬快灬深公交车hh| 我与ma的luanlun活史| 无码婬片A片AAA毛片艳谭| 师士传说| 韩国一级淫片特黄特刺激| 精品国产一级毛片| 亚洲AV日韩AV无码AV一区二区三区| 三女互摸互湿互磨豆腐小说| 国产精品秘?麻豆入口29| 欧美亚洲国产日韩综合在线播放| 久久r视频| 公猪钻入女人子宫会怎么样| 国产群p视频| 再深点灬舒服灬太大添视频| 欧美综合自拍亚洲综合图片区| 硬度不够时间短有什么办法| 玩各种老妇系列小说| 天干天干夜爽爽AV都市天气网| 麻豆tv下载| 中文字幕日韩欧美| 上门哺乳服务24小时热线| 欧美午夜视频| 我?啊高潮了?嗯~出水了中国| 伊人思思久99久女女精品视频| 91久久综合九色综合欧美98| 女被?c??黄扒衣服韩国| 鲁一鲁一鲁一鲁一鲁一曰| 将舌头伸入她两腿间的花缝里动漫| 欧美富婆色情俱乐部| 精品4k超清AV韩国女团饭拍| 免费做暖1000视频日本| 揉着我的奶从后面进去在线播放| 强开嫩苞又嫩又紧高H纯肉| 男人狂躁进女人免费视频| 别揉我胸啊嗯上课呢口述小说| 亚洲日韩精品欧美一区二区三区| 日日摸夜夜添狠狠添A片不卡 |