V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qua
V2EX  ›  数据库

MySQL 只读操作一般需要开启事务吗?

  •  
  •   qua · 2022-03-08 22:12:24 +08:00 · 2535 次点击
    这是一个创建于 1024 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我之前一般都是开事务的,但是后来发现其实大多数情况下,业务需求并不需要保证 Repetable Read 。MySQL RR 级别下,只读操作不开启事务,可以看成效果和 RC 级别一样吗?

    11 条回复    2022-03-10 09:44:07 +08:00
    kingcanfish
        1
    kingcanfish  
       2022-03-08 23:36:52 +08:00
    只读操作是指 mysql 所有的数据都是只读的 还是指 单个业务只读?前者的话当然可以不需要 后者的话 不行 你还要保证其他 业务的操作 不对当前读操作造成影响
    visitant
        2
    visitant  
       2022-03-09 02:42:01 +08:00
    这要看具体的业务场景了,这种问题肯定是由业务决定
    wangyu17455
        3
    wangyu17455  
       2022-03-09 03:11:21 +08:00 via Android
    不开的话,一条 sql 一个事务会不会影响性能?不是很懂
    jorneyr
        4
    jorneyr  
       2022-03-09 07:43:50 +08:00
    一次执行 100 条 select 开启事务和不开启事务效率差别还是比较大的,写程序测试过。
    qua
        5
    qua  
    OP
       2022-03-09 08:21:15 +08:00 via Android
    @jorneyr 一条一个事务性能会更差?
    simonlu9
        6
    simonlu9  
       2022-03-09 09:02:16 +08:00   ❤️ 1
    读也是有开事务的,只是 mysql 默认是 autocommit,你不需要手动标记事务开始与结束而已
    yibo2018
        7
    yibo2018  
       2022-03-09 10:34:44 +08:00
    @simonlu9 可重复读的事务级别下,读没有事务好吧,除非你加上 for update 这种 X 锁,或者 S 锁
    update 才会默认 autocommit
    yibo2018
        8
    yibo2018  
       2022-03-09 10:35:31 +08:00
    @yibo2018 即便加上 for update 也要用先开启事务,才会生效
    jorneyr
        9
    jorneyr  
       2022-03-09 14:04:08 +08:00
    @qua 是的,前不久进行过测试。
    simonlu9
        10
    simonlu9  
       2022-03-09 18:18:31 +08:00
    @yibo2018 如果没有开启事务,当前你所读的记录是属于那个版本,怎么保证你读的数据是否是已经提交,可重复读是指你当前的事务里面多次查询保证你看到的结果是一样的,不开启事务怎么实现可重复读
    yibo2018
        11
    yibo2018  
       2022-03-10 09:44:07 +08:00
    @simonlu9 对对
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5319 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:47 · PVG 13:47 · LAX 21:47 · JFK 00:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.