第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

[golang]MySQL中如何為單個(gè)事務(wù)設(shè)置隔離級別

標(biāo)簽:
Go

相比起简单的锁表,事务提供了更好的并发性能,但同时也带来更大的复杂性,如隔离级别,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()
}

参考



作者:一桶冷水
链接:https://www.jianshu.com/p/b324b368a210

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消