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

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

  •  
  •   letitbesqzr · 2018-07-11 10:32:33 +08:00 · 3859 次点击
    这是一个创建于 2332 天前的主题,其中的信息可能已经有所发展或是发生改变。
    事务 a : update medicine set num =15 where id = 1 (执行后没提交事务)

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


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

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

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

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

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

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


    letitbesqzr
        10
    letitbesqzr  
    OP
       2018-07-11 14:06:13 +08:00
    @zjp #7
    @HypoChen #5





    附了个图,测试了 RR RC 访问级,session2 都会 wait lock。
    zjp
        11
    zjp  
       2018-07-11 14:29:05 +08:00 via Android
    @letitbesqzr 没说用读已提交能避免锁啊,只是减小冲突率。事务结束时一次性提交的话可重复读和已提交读没区别。
    letitbesqzr
        12
    letitbesqzr  
    OP
       2018-07-11 14:30:59 +08:00
    @zjp #11 那像这种情况,只能不去使用外键了?因为就如上 excel 的 session1 和 session2 就算同时在不同事务中执行,也不会造成什么影响吧。
    zjp
        13
    zjp  
       2018-07-11 14:38:55 +08:00 via Android
    不清楚你的需要…应用层保证数据一致也可以
    letitbesqzr
        14
    letitbesqzr  
    OP
       2018-07-11 14:42:12 +08:00
    @zjp 就比如是购物网站,后台正在修改商品 A 的库存数量,但是修改库存数量这个事务在没提交的时候,用户就无法进行购买操作,因为订单数据表里会一个外键字段关联到商品表。
    saltxy
        15
    saltxy  
       2018-07-11 15:52:08 +08:00
    @letitbesqzr 这很正常呀,要是修改库存事务没提交,另外一个用户就购买成功了,不就会出现超卖了吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3471 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:03 · PVG 19:03 · LAX 03:03 · JFK 06:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.