70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
|
package main
|
|||
|
|
|||
|
import (
|
|||
|
"database/sql"
|
|||
|
_ "github.com/go-sql-driver/mysql"
|
|||
|
"log"
|
|||
|
)
|
|||
|
|
|||
|
var Db *sql.DB
|
|||
|
|
|||
|
func initdb() (err error) {
|
|||
|
Db, err = sql.Open("mysql", "root:123456@tcp(43.143.245.135:3306)/user")
|
|||
|
if err != nil {
|
|||
|
log.Println(err)
|
|||
|
return err
|
|||
|
}
|
|||
|
err = Db.Ping()
|
|||
|
if err != nil {
|
|||
|
log.Println(err)
|
|||
|
return err
|
|||
|
}
|
|||
|
log.Println("Successfully connected to mysql")
|
|||
|
Db.SetMaxOpenConns(10)
|
|||
|
Db.SetMaxIdleConns(5)
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
func main() {
|
|||
|
err := initdb()
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
transaction()
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
func transaction() {
|
|||
|
//开启事务
|
|||
|
tx, err := Db.Begin()
|
|||
|
if err != nil {
|
|||
|
log.Println("begin failed", err)
|
|||
|
return
|
|||
|
}
|
|||
|
//执行多个sql操作,即一个事务
|
|||
|
sqlstr1 := `update user set age=age-1 where id=1`
|
|||
|
sqlstr2 := `update user set age=age+1 where id=2`
|
|||
|
|
|||
|
_, err = tx.Exec(sqlstr1)
|
|||
|
if err != nil {
|
|||
|
log.Println("执行sql1出错了,要回滚", err)
|
|||
|
//回滚操作
|
|||
|
tx.Rollback()
|
|||
|
return
|
|||
|
}
|
|||
|
_, err = tx.Exec(sqlstr2)
|
|||
|
if err != nil {
|
|||
|
log.Println("执行sql2出错了,要回滚", err)
|
|||
|
//回滚操作
|
|||
|
tx.Rollback()
|
|||
|
return
|
|||
|
}
|
|||
|
//上两步操作都执行成功,就提交本次事务
|
|||
|
err = tx.Commit()
|
|||
|
if err != nil {
|
|||
|
log.Println(err)
|
|||
|
return
|
|||
|
}
|
|||
|
log.Println("事务执行成功")
|
|||
|
}
|