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

2018-07-11 10:32:33 +08:00
 letitbesqzr
事务 a : update medicine set num =15 where id = 1 (执行后没提交事务)

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


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

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

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

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

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

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


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





附了个图,测试了 RR RC 访问级,session2 都会 wait lock。
zjp
2018-07-11 14:29:05 +08:00
@letitbesqzr 没说用读已提交能避免锁啊,只是减小冲突率。事务结束时一次性提交的话可重复读和已提交读没区别。
letitbesqzr
2018-07-11 14:30:59 +08:00
@zjp #11 那像这种情况,只能不去使用外键了?因为就如上 excel 的 session1 和 session2 就算同时在不同事务中执行,也不会造成什么影响吧。
zjp
2018-07-11 14:38:55 +08:00
不清楚你的需要…应用层保证数据一致也可以
letitbesqzr
2018-07-11 14:42:12 +08:00
@zjp 就比如是购物网站,后台正在修改商品 A 的库存数量,但是修改库存数量这个事务在没提交的时候,用户就无法进行购买操作,因为订单数据表里会一个外键字段关联到商品表。
saltxy
2018-07-11 15:52:08 +08:00
@letitbesqzr 这很正常呀,要是修改库存事务没提交,另外一个用户就购买成功了,不就会出现超卖了吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/469832

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX