golang实现MySQL数据库事物的提交与回滚

LosAngel 等级 676 0 0

MySQL 事务主要用于处理操作量大,复杂度高的数据。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务用来管理 insert,update,delete 语句,事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

本文主要介绍golang实现MySQL数据库事物的提交与回滚。用到的库有:

"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","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()
}

如有不对欢迎指正,相互学习,共同进步。

本文转自 https://blog.csdn.net/wade3015/article/details/87893532,如有侵权,请联系删除。

收藏
评论区

相关推荐

手动开启事务回滚
有些时候进行一些判断后,根据当前状态需要进行事务回滚,用以下代码实现 //手动开启事务回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
golang实现MySQL数据库事物的提交与回滚
MySQL 事务主要用于处理操作量大,复杂度高的数据。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务用来管理 insert,update,delete 语句,事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicit
MySQL8与PG10:新版本下的较量谁更胜一筹?
既然MySQL 8和PostgreSQL 10已经发布了,现在是时候回顾一下这两大开源关系型数据库是如何彼此竞争的。在这些版本之前,人们普遍认为,PostgreSQL在功能集表现更出色,也因其“学院派”风格而备受称赞,MySQL则更善长大规模并发读/写。但是随着它们最新版本的发布,两者之间的差距明显变小了。特性比较首先来看看我们都喜欢谈论的“时髦”功能。过去
2.MySQL日志
**MySQL日志分类** * * *   MySQL日志主要包含:错误日志、查询日志、慢查询日志、重做日志、回滚日志、二进制日志 **错误日志:**   用来记录 MySQL 服务器运行过程中的错误信息,比如,服务器启动关闭信息、运行错误信息、时间调度器运行一个事件时产生的信息、在服务器上启动进程产生的信息。   错误日志可以自己配置,lo
MySQL binlog2sql实现MySQL误操作的恢复
对于MySQL数据库中的误操作删除数据的恢复问题,可以使用基于MySQL中binlog做到类似于闪回或者生成反向操作的SQL语句来实现,是MySQL中一个非常实用的功能。 原理不难理解,基于MySQL的row格式的binlog中,记录历史的增删改SQL信息,基于此解析出来对应的SQL语句(回滚的话就是反向的SQL语句)。 在格式为binlog格式为r
MySQL —— 存储引擎的 InnoDB 与 MyISAM 之争
作为 MySQL 数据库的两种主要的存储引擎,InnoDB 与 MyISAM 各有长处。 在 MySQL 5.1 及之前的版本中,MyISAM 是默认的存储引擎,而在 MySQL 5.5 版本以后,默认使用 InnoDB 存储引擎。 MyISAM 不支持行级锁,换句话说,MyISAM 会对整张表加锁,而不是针对行。同时,MyISAM 不支持事务和外键。M
MySQL数据表类型
MySQL一共向用户提供了包括DBD、HEAP、ISAM、MERGE、MyIASM、InnoDB以及Gemeni这7种Mysql表类型。其中DBD、InnoDB属于事务安全类表,而其他属于事务非安全类表。 ①   Berkeley DB(DBD)表是支持事务处理的表,由Sleepycat软件公司开发。它提供MySQL用户期待已久的功能--事务控制。事务控制
Mysql优化系列(1)
1.简单介绍 InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在
Mysql技术总结总结
**一:mysql数据库引擎MyISAM和InnoDB的区别:** ================================= 1、MyISAM 具有检查和修复表格的大多数工具。表格可以被压缩,而且支持全文收索 。不支持事物,而且不支持外键。 2、innodb 这种表是事务安全的。提供了commit(提交) rollback(实务回滚)支持外键,
mysql命令行常用命令
 第一招、mysql服务的启动和停止   net stop mysql   net start mysql   第二招、登陆mysql   语法如下: mysql -u用户名-p用户密码   键入命令mysql -uroot -p,回车后提示你输入密码,输入12345,然后回车即可进入到mysql中了,mysql的提示符是:   mysql>
mysql忘记root用户密码找回步骤
修改或找回root密码步骤1.修改MySQL的登录设置: # vi /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 保存并且退出vi。 2.重新启动mysqld # /etc/init.d/mysqld restart ( service mysqld restar
mysql:优化
看了描述大概明白题主困惑是什么了。题主应该是误以为,由begin,增删改查语句,commit组成的才叫事务。其实一般这种叫事务块。我原来也有这种误解。而没有begin,end包围的单独的每条语句也都是事务(如果开了自动提交的话,而在很多数据库里默认都开,比如题主说的mysql)。再就是写冲突问题。并发写的时候,单机数据库一般就是加锁,像mysql,分布式的多
BeetlSQL 3.1.0 发布,spring saga 事务支持
本次发布增强了Saga在spring下的支持,使用kafka提供重试以及重试失败后放入丢弃队列里 Saga是用来在微服务中的长事务管理,具备ACID中的ACD,不具备I,隔离性。在一定业务条件下,可以使用Saga非常简单和方便的管理微服务事务。同理,也可以用于管理多库事务 Saga要求微服务提供回滚操作,然后如果需要回滚,有Saga编排调度各个微服务对应
PHP 对 mysql 的事务处理
mysql>mysql事务处理php代码实现事务的处理可以通过PHP预定义类mysqli的以下方法实现。 **autocommit(boolean)**:该方法用于限定查询结果是否自动提交,如果该方法的参数为true则自动提交,如果参数为false则关闭自动提交。MySQL数据库默认为自动提交。 **rollback()**:利用mysqli类中的该
Redis和MySQL数据一致中出现的几种情况
**1\. MySQL持久化数据,Redis只读数据** redis在启动之后,从数据库加载数据。 读请求: 不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取 写请求: 数据首先都写到数据库,之后更新redis(先写redis再写mysql,如果写入失败事务回滚会造成redis中存在脏数据) **2.MySQL和Redis