› 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
letitbesqzr
V2EX  ›  MySQL

mysql 中这种是什么类型的锁?

  •  
  •   letitbesqzr · Jul 11, 2018 · 4742 views
    This topic created in 3030 days ago, the information mentioned may be changed or developed.
    事务 a : update medicine set num =15 where id = 1 (执行后没提交事务)

    事务 b: insert into herbal ('medicine') values (1) (这里等待事务 a 提交以后才能执行成功,否则一直锁等待)


    事务 b 中的 herbal 表关联了 medicine 表,如果光是使用他,也需要去等待事务 a 执行完?有什么办法能够避免呢
    Supplement 1  ·  Jul 11, 2018
    我的意思是
    事务 b 中 insert into herbal ('medicine') values (1) 使用了 事务 a 中修改后 medicine,还没提交的事务,导致的锁。
    15 replies  •  2018-07-11 15:52:08 +08:00
    a7a2
        1
    a7a2  
       Jul 11, 2018
    你对事务 理解可能有点错误。。。
    letitbesqzr
        2
    letitbesqzr  
    OP
       Jul 11, 2018
    @a7a2 #1 应该没问题吧,我只是举例 事务 a 里 还有很多其他 sql,只是简单举例说了下
    rodericliu
        3
    rodericliu  
       Jul 11, 2018
    这个还真不是事务,这个只是 MYSQL 的表锁,如果你采用的 MyISAM 引擎,如果是写操作,那么会全表锁,也就是只能等你 a 执行完了,表锁才释放,b 才能继续执行;如果是 InnoDB 引擎,因为是行级锁,就不会有这个问题。
    letitbesqzr
        4
    letitbesqzr  
    OP
       Jul 11, 2018
    @rodericliu #3 是 InnoDB 引擎。这样的确会锁上,
    Hyponet
        5
    Hyponet  
       Jul 11, 2018
    参考事务隔离级别:
    ====================================================================================
    隔离级别 脏读( Dirty Read ) 不可重复读( NonRepeatable Read ) 幻读( Phantom Read )
    ====================================================================================

    未提交读( Read uncommitted ) 可能 可能 可能

    已提交读( Read committed ) 不可能 可能 可能

    可重复读( Repeatable read ) 不可能 不可能 可能

    可串行化( Serializable ) 不可能 不可能 不可能

    ====================================================================================
    letitbesqzr
        6
    letitbesqzr  
    OP
       Jul 11, 2018
    @HypoChen #5 使用的 rr,事务 a 在修改的时候不允许其他事务再去读?像这样的语句 insert into herbal ('medicine') values (1) 关联使用了他,而没去查询他,也算是读?也会锁等待?
    zjp
        7
    zjp  
       Jul 11, 2018 via Android
    herbal 表外键到 medicine,插入时要检查 medicine 存不存在对应的记录,这不是读了吗?一致性要求不高的话用读已提交
    letitbesqzr
        8
    letitbesqzr  
    OP
       Jul 11, 2018
    @zjp #7 的确是这样,感谢,了解了,我换 rc 吧。
    letitbesqzr
        9
    letitbesqzr  
    OP
       Jul 11, 2018
    @zjp #7
    我测试把 隔离级别改为 RC 了,但是一样会存在这样的问题,


    letitbesqzr
        10
    letitbesqzr  
    OP
       Jul 11, 2018
    @zjp #7
    @HypoChen #5





    附了个图,测试了 RR RC 访问级,session2 都会 wait lock。
    zjp
        11
    zjp  
       Jul 11, 2018 via Android
    @letitbesqzr 没说用读已提交能避免锁啊,只是减小冲突率。事务结束时一次性提交的话可重复读和已提交读没区别。
    letitbesqzr
        12
    letitbesqzr  
    OP
       Jul 11, 2018
    @zjp #11 那像这种情况,只能不去使用外键了?因为就如上 excel 的 session1 和 session2 就算同时在不同事务中执行,也不会造成什么影响吧。
    zjp
        13
    zjp  
       Jul 11, 2018 via Android
    不清楚你的需要…应用层保证数据一致也可以
    letitbesqzr
        14
    letitbesqzr  
    OP
       Jul 11, 2018
    @zjp 就比如是购物网站,后台正在修改商品 A 的库存数量,但是修改库存数量这个事务在没提交的时候,用户就无法进行购买操作,因为订单数据表里会一个外键字段关联到商品表。
    saltxy
        15
    saltxy  
       Jul 11, 2018
    @letitbesqzr 这很正常呀,要是修改库存事务没提交,另外一个用户就购买成功了,不就会出现超卖了吗
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5145 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 08:45 · PVG 16:45 · LAX 01:45 · JFK 04:45
    ♥ Do have faith in what you're doing.