美文网首页Go语言Golang
[golang]MySQL中如何为单个事务设置隔离级别

[golang]MySQL中如何为单个事务设置隔离级别

作者: 一桶冷水 | 来源:发表于2018-03-07 23:07 被阅读47次

相比起简单的锁表,事务提供了更好的并发性能,但同时也带来更大的复杂性,如隔离级别,mvcc,死锁等。网上关于事务隔离级别的介绍遍地都是,就不再赘述了。

MySQL提供了3个等级的隔离级别配置,下面分别列出配置方法:

  1. 全局
    直接改配置文件
    set global transaction isolation level repeatable read;
  2. 当前session
    set tx_isolation = 'repeatable-read';
    set session transaction isolation level repeatable read;
  3. 下一个事务
    set transaction isolation level repeatable read;

但是在Go的MySQL驱动是自带连接池的,这使得这3个等级都无法直接使用,毕竟谁知道下一条sql会跑在哪个连接上呢?那么有什么解决方案呢?

  1. Go1.8以后的版本,sql库新增了API BeginTx,直接调用即可
tx0, err := db.BeginTx(context.Background(), &sql.TxOptions{
    Isolation: sql.LevelReadUncommitted,
})
  1. 如果是1.8以前的版本,可以利用事务在一个session上处理的特性hack一下
tx1, err := db.Begin()
_, err = tx1.Exec("ROLLBACK")
_, err = tx1.Exec("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
_, err = tx1.Exec("BEGIN")
rows, err := tx1.Query("SELECT COUNT(*) FROM USER")
rows.Close()
tx1.Commit()
  1. 或者也可以使用不同的配置创建两个db对象,每个对象有自己独立的连接池
db0, err := sql.Open("mysql", "root@/test")
db1, err := sql.Open("mysql", "root@/test?tx_isolation='read-uncommitted'")

最后提供一段测试代码,可以很清楚的看到read-uncommitted带来的脏读问题。

func main() {
    db, err := sql.Open("mysql", "root@/test")
        if err != nil {
        panic(err)
    }
    db1, err := sql.Open("mysql", "root@/test?tx_isolation='read-uncommitted'")
    if err != nil {
        panic(err)
    }

    tx0, err := db.Begin()
    if err != nil {
        panic(err)
    }

    _, err = tx0.Exec("insert into user value (null,?)", "cc")
    if err != nil {
        panic(err)
    }

    rows, err := db1.Query("select count(*) from user")
    if err != nil {
        panic(err)
    }
    for rows.Next() {
        s := 0
        err = rows.Scan(&s)
        if err != nil {
            panic(err)
        }
        fmt.Println(s)
    }
    tx0.Rollback()
}

参考

相关文章

  • [golang]MySQL中如何为单个事务设置隔离级别

    相比起简单的锁表,事务提供了更好的并发性能,但同时也带来更大的复杂性,如隔离级别,mvcc,死锁等。网上关于事务隔...

  • mysql笔记

    mysql笔记 查看事务隔离级别 show variables like '%iso%'; 设置事务级别 mysq...

  • Mac系统mysql设置事务隔离级别

    Mac系统mysql设置事务隔离级别 MySQL数据库事务隔离级别主要有四种: Serializable 串行化,...

  • Mac系统设置MySQL事务隔离级别永久版

    Mac系统设置MySQL事务隔离级别永久版 之前介绍过一种暂时性的更改MySQL数据库事务隔离级别的设置方法...

  • mysql事物隔离机制

    Mac系统mysql设置事务隔离级别 事务隔离级别指的是在处理同一个数据的多个事务中,一个事务修改数据后,其他事务...

  • mysql事务隔离级别的实现原理

    mysql事务隔离级别的实现原理 mysql innodb中的四种事务隔离级别[https://www.jians...

  • 数据库事务和锁

    参考链接:MySQL中Innodb的事务隔离级别和锁的关系 1. 事务 事务:事务是作为单个逻辑单元工作执行的一些...

  • 隔离级别

    mysql事务隔离级别 不设置隔离,可能导致修改丢失 一. read uncommitted(读取未提交数据) ...

  • 聊聊MySQL的隔离级别

    原文:聊聊MySQL的隔离级别 | MySQL隔离级别原理参考:oracle - mysql - 数据库事务隔离级...

  • MySQL 事务隔离级别解析和实战

    MySQL 事务隔离级别解析和实战 1、MySQL 隔离界别查看 查看回话隔离级别 查看系统隔离级别 2、MySQ...

网友评论

    本文标题:[golang]MySQL中如何为单个事务设置隔离级别

    本文链接:https://www.haomeiwen.com/subject/cbpsfftx.html