关于 MySQL 并发事务 加锁这一块的内容,有没有什么讲得比较好的书或者资料

2021-03-13 11:06:53 +08:00
 zxCoder

看那个 MySQL 是怎么运行的,看了一遍对这部分还是迷迷糊糊,感觉细节,概念很多,把握不到整体的一个结构。

4233 次点击
所在节点    数据库
70 条回复
AxEqaq
2021-03-13 23:29:00 +08:00
而且你还在上学?要以后写业务?确定不了解下 mysql 的锁?这个其实有助你做业务,我去年做个一个技改项目就是将 mysql 迁移至 mongodb 并对上层重构,tps 翻了近 10 倍,而且无须考虑未来五年扩容,如果对 db 了解不深刻,架构师很容易怼人
pedia
2021-03-13 23:30:40 +08:00
@gBurnX

”如果你完整地从底层开始,逐步学习了这些知识,按照层次划分,数据库的锁就是对 OS 提供的进行包装而已。

但如果你没有系统地构建知识树,你可能会说,数据库的锁本质是由更下层的模块提供,比如指令,CPU 甚至电路等等。你这种说法当然也没错”

通过你的说法 我甚至可以判断你根本不理解数据库里的锁是什么.
gBurnX
2021-03-13 23:41:49 +08:00
@AxEqaq

1.我觉得,自己应该对自己负责,不能只按毕业最低要求去搞。不然这么多竞争者,以后工作都不好找。
我当时的室友,学 C 时,一个章节的课后作业就写了 3k 行代码;
C++课,他直接写了个 wow 那种无边界地图的底层引擎;
多媒体课,他写了个联机飞行游戏;
他大一假期就被一堆公司预定,毕业论文直接被评为省优,毕业时 bat 还有一堆公司是邀请他去。

2.我已经工作几年了。建议你应该从模电->数电->OS->数据库,走那么一遭,因为上层的锁,都是由底层提供原理、实现方法与性能。你把底层学完,数据库你也能实现,只是个时间问题。mysql 锁真没那么神奇,那些什么 mysql 内幕的书籍,也就是讲讲设计方法与内部细节,你如果把基础打扎实,比如底层、数据结构与算法,这些解密的书也就那么回事,有空翻翻,不看也罢。

3.mongodb,我室友和我说过,要注意一下它的坑,10gen 团队早期为了融资,故意想抬高 mongodb 的跑分,它默认的写入策略是 mongodb server node 收到 client 发来的数据后,先回应 client 说已经写入,然后再来进行写入,如果 server node 内部负载较高时,导致写入失败,此时 client 以为已经写入,这数据本质上就算是丢了。早期 mongodb 因这问题,导致一些 dba 丢工作。你现在用 mongodb,建议扒开代码看看这个坑还在不在,跟着源码 debug 一次,因为这坑在负载低时不容易检查出来。
gBurnX
2021-03-13 23:45:20 +08:00
@pedia

你不同意这结论,不妨谈谈你的看法,说不定你有更好的理解,大家向你学习。
pedia
2021-03-13 23:50:36 +08:00
@gBurnX 操作系统的锁在数据库称为 latch,行锁,表锁在数据库都是逻辑锁.

你才大一,好好学习。
AxEqaq
2021-03-13 23:59:55 +08:00
@gBurnX
1.2.工作几年还是大一找实习?
3.辛苦您了解下 2pc3pc,另我的 mongo 集群在双 11 和 618 期间单个 shard 最高峰写入量 20w/min,淡季每周集群写入接近 300 亿文档
gBurnX
2021-03-14 00:00:53 +08:00
@pedia

1.你把数据库的行锁与表锁称为逻辑锁,那么逻辑锁又是怎么完成锁功能的呢?
我在前面一直强调底层,强调包装,就是希望避免有人被文档或书籍换个名词,就不知道它的本质了。

2.我不是大一。你应该再细心些看看我之前的评论。那个问题是帮朋友的弟弟提的。
AxEqaq
2021-03-14 00:02:43 +08:00
@pedia 这哥们也是逗,lock 和 latch 也是分不清,非要拿个游戏作业来说事
pedia
2021-03-14 00:06:32 +08:00
@gBurnX 逻辑锁的意思通俗解释是 0 代表持锁,1 代表不持锁,事务是否持有锁只需要判断状态位为 0 或者 1, 并不需要你所说的操作系统的锁来实现.
gBurnX
2021-03-14 00:10:50 +08:00
@AxEqaq

1.我工作好几年了。

2.nPC 问题,没记错的话,第一次提出是在通信原理课程,还不是数据库课程。这个知识点,数据库书籍没有通信原理讲的清楚,建议你还是去看看通信原理。以前 2G + 绿皮车在山洞里,测出 5PC 都不够用。

3.你发公司设备峰值写入量 20w/min,每周 300 亿文档,我能说啥好....如果你在 v2 那个微信群,看到小伙伴前几天发他自己家里设备,4k 60MB/s 与 seq 9GB/s,估计你们公司老板应该会很羞愧吧。。
gBurnX
2021-03-14 00:12:29 +08:00
@pedia
如果不需要操作系统的锁,那么怎么解决多把逻辑锁的并发问题?
pedia
2021-03-14 00:16:06 +08:00
@gBurnX 我前面提到了 每个事务来判断 record 的 0 或 1 即可。

你可能要问如何保证读取这个标志位的原子性呢,这需要 latch 互斥,这是两个问题,并不涉及事务锁的问题。
gBurnX
2021-03-14 00:23:02 +08:00
@pedia

你看,数据库书籍,先把操作系统的锁,换个名词叫 latch 。然后自己搞一套东西叫 lock 。最终自己搞的 lock,仍然需要 latch (操作系统的锁)来提供最基本的功能。

这不就我最开始说的:数据库对操作系统层次的锁,进行了进一步的包装,根据业务需求生成了行锁、表锁、全局锁等等。你摸着自己的良心,评价一下,我这句话有错嘛?

而且,我从一开始,就建议,一定要多学学底层,这样就不会被数据库书籍,换个名词,就给整蒙了。

对于底层来说,锁就那么一回事。数据库为了标榜自己,不换个名词,怎么能有名气?你看 10gen 为了拉投资,早期干的那些事。
AxEqaq
2021-03-14 00:25:10 +08:00
@gBurnX
1 工作几年没看得出,但一定没做过互联网吧?
2 分布式系统必须要考虑的,你说的 normal 写入模式也是如此
3 不要拿 iot 说事,拿到互联网就是渣渣,老老实实时序数据库不好吗,假装退休的老板姓马,不过最近我要撤了
4 我替那兄弟答了,一个 latches 可能会占几个时间片,一个 db lock 占用的时间片轻松几百个,os 才不干这种累活
gBurnX
2021-03-14 00:33:00 +08:00
@AxEqaq

1.看不出别人真实工作年限,这太正常了。如果你熟悉 HR 圈,就会明白,只有极少数水平超高的业内面试官,才有可能猜准。

2.分布式系统,考不考虑是一回事,实际工作中知不知道是另一回事。顺便问问你,你们如何检查数据库在读取数据时,有没有遗漏或读错?

3.我没提 iot,你是怎么看出来我提的?

4.我问他的问题是 [如果不需要操作系统的锁,那么怎么解决多把逻辑锁的并发问题?] ,你的回答,在答个啥?
AxEqaq
2021-03-14 00:44:36 +08:00
@gBurnX
2.我认为你是在杠
4.请仔细看懂我的回答,再翻译下,事务锁和 os 锁闩是两码事
gBurnX
2021-03-14 00:57:17 +08:00
@AxEqaq

2.杠我有必要提醒你 MongoDB 的黑历史?
杠我有必要建议你那公司设备数据其实没啥现在有更好设备了但你没看出?
杠我有必要提醒你 MongoDB 除了前面黑历史外,其实还有数据 io 的坑,但你也没看出?

4.我第二次说,我从头到尾就没说过这玩意是一码事。
不知道是第几次说,那玩意就只是包装了 OS 的锁,不用太在意,真就那么回事...
另外没必要一直被数据库书籍的名词牵着鼻子走。

研究数据库,应该跟着业务走,总在基础这里过不去,浪费时间,你真不如把底层好好学学,尽早去研究业务。
AxEqaq
2021-03-14 01:40:07 +08:00
@gBurnX
2. 全世界只有你知道 10gen 的黑历史???比我们大组一堆划水 p8 都烂熟于心???哈???
4. 我也懒得说了,您好好写 c 吧
Goldilocks
2021-03-14 03:23:06 +08:00
如果你对锁这块特别感兴趣,你可以去看看 software transaction memory 的书,看它是怎么实现的。基本上数据库里所有和锁相关的东西都在里面了。然后回头再来看数据库的文档
dartabe
2021-03-14 05:27:35 +08:00
硬件的锁也是实现软件的算法而已 所以了解一下很简单

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

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

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

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

© 2021 V2EX