V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
hheedat
V2EX  ›  MySQL

如果不能满足可重复读,有啥实际危害的例子?

  •  
  •   hheedat · 2018-03-23 19:05:04 +08:00 · 9671 次点击
    这是一个创建于 2435 天前的主题,其中的信息可能已经有所发展或是发生改变。

    proxy

    MySQL 的可重复读隔离级别( RR ),在一个事务中可以保证读到的内容是一样的

    今天同事问我这个隔离级别有啥用,我随手给他搜了个例子,说不满足的话会这样

    rr

    这个例子形象的解释了 RC 下的表现,我同事问我,读到 900 不是挺好的么,实际就是 900 了啊...

    我想了半天,好似没有想到不能满足 RR 的危害的例子。

    同志们能否帮我想一个... 在一个事务中两次读到的不一致,有啥危害?(两次读的场景我都没想到,干嘛读两次)

    13 条回复    2018-03-25 11:45:27 +08:00
    CH818
        1
    CH818  
       2018-03-23 19:10:08 +08:00 via iPhone   ❤️ 2
    我觉得把因为不知道自己读到的数据是不是正确的。
    他要是一开始拿 1000 去做计算,算完心想咱们读个 A 看看,读了一看呀,A 怎么变成 900 了?难道我前面做的计算都白做了么!
    zarte
        2
    zarte  
       2018-03-23 19:53:41 +08:00
    这个问题不就是为啥要有锁的原因么
    billlee
        3
    billlee  
       2018-03-23 20:08:34 +08:00
    BEGIN TRANSACTION
    UPDATE 表 1 SELECT FROM ....
    // 不可重复读
    UPDATE 表 2 SELECT FROM ...
    COMMIT

    表 1 和 表 2 不一致了
    luosuosile
        4
    luosuosile  
       2018-03-23 20:09:14 +08:00
    我看不懂啊,问题在哪里。这不是两个事务吗,如果是银行的话这两个任务不是不能一起做吗。
    假如能这么做的话,请问能不能给我解释下这个图的问题在哪里呀?
    不可重复读是说,一个事务只批准读取一次。
    还是不能两个事务同时读取一个数据?
    fcten
        5
    fcten  
       2018-03-23 20:15:07 +08:00   ❤️ 1
    事务 A:select 最近 1 个月注册的新用户,把他们的用户组改成 GroupA
    事务 B:注册了一个新用户,commit
    事务 A:select 最近 1 个月注册的新用户,给他们发送一条私信:恭喜你升级为 GroupA !

    不一致本身没有危害。有危害的是不知道会不一致。
    Keita1314
        6
    Keita1314  
       2018-03-23 20:22:43 +08:00
    ACID 啊
    xhystc
        7
    xhystc  
       2018-03-23 20:31:51 +08:00 via Android
    可重复读不是真的要读两次,而是指一个事务在使用这个值的时候,这个值被其他事务修改了,那么以这个值为基础的计算都是错的,如果计算后再写回数据库就会造成不一致
    honam
        8
    honam  
       2018-03-23 20:35:28 +08:00
    比较认同一楼的,其余都感觉答不到点。。。
    hheedat
        9
    hheedat  
    OP
       2018-03-23 22:25:34 +08:00
    @fcten 你这个栗子举得很好!
    alcarl
        10
    alcarl  
       2018-03-24 08:48:38 +08:00 via Android   ❤️ 2
    5 楼那个并不能算危害,同一个任务两次 select 本身就是多余的。mysql 默认 rr 主要是为了主从同步时,采用逻辑 sql 同步时的一致性,因为主库的 sql 是并发执行的,会有两个事务一起再跑,从库同步是单线程的,不会有两个事务同时在跑,如果不是 rr,出现楼主的栗子说的情况时,主从数据就不一致了
    MortyP
        11
    MortyP  
       2018-03-24 09:29:54 +08:00 via Android
    头像好评,我的微信头像也是他
    bxb100
        12
    bxb100  
       2018-03-24 16:45:05 +08:00 via Android
    先读后写,使用乐观锁.
    hheedat
        13
    hheedat  
    OP
       2018-03-25 11:45:27 +08:00
    @alcarl 你这个很好!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3554 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:51 · PVG 08:51 · LAX 16:51 · JFK 19:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.