对比了 jdk 中的 lock 和 mysql 的锁

2017-07-30 01:30:55 +08:00
 ihuotui
发现 lock 和 mysql 的独占锁 共享锁 提升性能的思路一样。哈哈,在高层次的思想都是一样。
2467 次点击
所在节点    Java
8 条回复
CryMeatel
2017-07-30 13:38:58 +08:00
读的话,为啥要加锁
ihuotui
2017-07-30 14:11:11 +08:00
@CryMeatel java 要同步数据,mysql 中复杂一些,并发中的事务 保证 acid 又性能最好,mysql 建议看看书或者手册。
RLib
2017-07-30 15:31:04 +08:00
本来就是这么回事,有人在读你就不能写但能读,有人在写大家都不能读也不能写,以往普通锁就是不分青红皂白都锁起来
mikulch
2017-07-30 16:08:11 +08:00
mysql 的排他锁和共享锁和读锁和写锁可不是一样的东西。和 java 的读写锁也不太一样。共享锁和排他锁针对的是 innoDB 的行级锁。读锁和表锁针对的是 myisam 的表级锁。

不是一个东西无法比较。
另外,mysql 中数据被加上排他锁以后,会阻止该数据被获取独占锁和共享锁。但是允许该数据被读取。
所以数据被读取和获取共享锁不是一个概念。共享锁排他锁也不是读写分离的思想。只是一种并发访问安全性的解决方案而已。
RLib
2017-07-30 16:44:45 +08:00
@mikulch 既然题主说的站在高层看待问题,又为何要扯回具体锁上去。简单来看,一切锁不过是为了保证读和写的安全,为了保证性能,'读'和'写'这两个基本操作的锁肯定是要分开的,那么说共享锁、排他锁(独占锁)有读写分离的思想也无可厚非。另外,我对 mysql 了解不深,但是对你说的“ mysql 中数据被加上排他锁以后...但是允许该数据被读取”存在怀疑,你这里的所谓允许读取,大概是因为 select 时不会去尝试获取和检查锁,所以锁对它根本不起作用,不妨换个角度想,如果那样的话这里读取的安全该由什么保证呢?
ihuotui
2017-07-30 17:58:38 +08:00
@mikulch 在说 mysql 我是指 innodb 引擎,在可重复读事务条件下,事务 a 对某行用了独占锁,其他事务(对同样一行,共享锁和排他锁)都会被阻塞,跟 java 的读写锁差不多就是写的时候变为串行,读并行。
mikulch
2017-07-31 00:29:00 +08:00
@ihuotui
@RLib

要保证读取安全的话其实有很多方式,如果用锁的话自然用起来都差不多。要保证读写安全的话其实除了使用锁使用 COW 类也是可以的。我个人感觉 COW 算是比较彻底的读写分离的思想。读写锁的话我觉得用读写分离来形容实际上不够纯粹。
另外,锁这个东西如果再深入到汇编的话也有相应的 cpu 指令。其实我不太同意两位所说的高层的思想比较相通。其实恰恰是微观的东西都是相通的。就跟现在的所谓一大堆分布式理论一样,都是从微观计算机到宏观分布式的一种延伸。
ihuotui
2017-07-31 01:14:35 +08:00
@mikulch 分布式锁和 java 多线程锁在表现一样( zk 表现就是多个竞争一个成功,跟 java 锁一样),但是算法理论上实现有区别。还是宏观一样实现不同。

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

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

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

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

© 2021 V2EX