ARTS 打卡第四周(200601-200607)
Algorithm
leetcode-349: https://leetcode.com/problems/intersection-of-two-arrays/
思路:空间换时间
使用Map/Set保存第一个数组的数字,遍历第二个数组,如果数字在Map存在,说明是交集,加入返回集合
leetcode-350: https://leetcode.com/problems/intersection-of-two-arrays-ii/
思路:排序后,维护两个下标,同时遍历两个数组,如果相等,加入返回集合,否则,移动较小值对应的下标
Review
https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and
DRY-Don't Repeat Yourself,不仅仅是不写重复的代码块,更重要的是不写重复功能/职责的代码块。要反复地去优化代码,抽象代码块。
代码模块化不仅仅是简单的按功能将一个大的代码拆分为几个小函数,或将相同的功能分布在一起,而是研究如何是方法保持分离并限制整个代码库间的协调。即知道哪些代码块需要互相交互,哪些需要共享资源,哪些需要共同承担职责,更重要的是,存在哪些外部约束。
关于重写
一项重写工作如果三个月了都没有下文,大概率就是永远都不会去做了。
重写代码一直都是一个很难的话题,因为业务需要快速发展,代码会越来越多,想优化的东西又太多,但是却想这些优化快速完成,不要重写代码的含义应该是“不要追求快速的重写”。
Tip
MySQL有四种事务隔离级别
RU(Read UnCommitted):读未提交,允许出现脏读,幻读
RC(Read Committed):读提交,不允许脏读,只读取已经提交事务的数据,多次读取会出现不一样的结果,称为不可重复读。
RR(Repeatable Read):可重复读,同样的select,多次读取的结果一样,可能会出现幻读
SERIALIZABLE:序列化,读操作完全串行化,加了隐形的读共享锁,避免了脏读、不可重复读和幻读的问题
隔离级别的问题
MySQL的锁类型
共享锁(S锁):允许事务读取一行数据
独占锁(X锁):允许事务删除或更新一行数据
S 锁和 S 锁是兼容的,X 锁和其它锁都不兼容。
为了实现多粒度的锁机制,InnoDB 还有两种内部使用的意向锁,由 InnoDB 自动添加,且都是表级别的锁。
意向共享锁(IS):事务即将给表中的各个行设置共享锁,事务给数据行加 S 锁前必须获得该表的 IS 锁。
意向排他锁(IX):事务即将给表中的各个行设置排他锁,事务给数据行加 X 锁前必须获得该表 IX 锁。
InnoDB 存储引擎使用三种行锁的算法用来满足相关事务隔离级别的要求。
Record Locks
该锁为索引记录上的锁,如果表中没有定义索引,InnoDB 会默认为该表创建一个隐藏的聚簇索引,并使用该索引锁定记录。
Gap Locks
该锁会锁定一个范围,但是不包括记录本身。可以通过修改隔离级别为 READ COMMITTED 或者配置 innodb_locks_unsafe_for_binlog 参数为 ON。
Next-key Locks
该锁就是 Record Locks 和 Gap Locks 的组合,即锁定一个范围并且锁定该记录本身。InnoDB 使用 Next-key Locks 解决幻读问题。
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。在MySQL中,就是两个或两个以上的事务在互相等待。
Share
Blog-为什么需要分布式系统
参考链接:
MySQL事务隔离级别
https://tech.meituan.com/2014/08/20/innodb-lock.html
原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
如果本文对你有帮助,请点个赞吧,谢谢
版权声明: 本文为 InfoQ 作者【老胡爱分享】的原创文章。
原文链接:【http://xie.infoq.cn/article/9f222ef9535de4c036cd0080e】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论