CAS是什么
比较并交换。用于实现乐观锁,就是一个预期值和要更新的变量值进行比较,两者相等才会更新
悲观锁和乐观锁
悲观锁:认为共享资源每次被访问的时候就会出现共享数据被修改的问题,所以每次获取资源操作都会上锁。共享资源每次只给一个线程使用,其他线程阻塞,用完后再把资源转让给其他线程
乐观锁:认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁等待,只是在提交修改时去验证对应的资源是否被其他线程修改了。
mvcc机制
隐藏字段,Read View undo log
在内部实现中,InnoDB通过数据行的DB_TRX_ID和Read View来判断数据的可见性,如不可见,则通过数据行的DB_ROLL_PTR找到undo log中的历史版本。每个事务读到的数据版本可能是不一样的,在同一个事务中,用户只能看到该事务创建Read View之前已经提交的修改和事务本身做的修改
mysql表锁
表级别的共享锁,也就是读锁。表级别的独占锁也就是写锁
如果一张表加了共享表锁,那么本线程接下来如果要对表执行写操作,会被阻塞,其他线程对表进行写操作也会被阻塞。
脏读
如果一个事务读到另一个未提交事务修改的数据就意味着发生了脏读的现象。
zset原理
zset类型每个存储元素相当于有两个值组成的,一个是有序集合的元素值,一个是排序值。
链表在查找元素的时候,因为需要逐一查找,所以查询效率非常低,时间复杂度为O(n),于是就出现了跳表。跳表是在链表基础上改进过来的,实现了一种多层的有序链表,这样的好处就是能快速定位数据
查找一个跳表节点的过程时,跳表会从头节点的最高层开始,逐一遍历每一层。在遍历某一层的跳表节点时,会用跳表节点中的SDS类型的元素和元素的权值来进行判断,共有两个判断条件:
如果当前节点的权重小于要查找的权重时,跳表就会访问该层上的下一个节点
如果当前节点的权重等于要查找的权重时,并且当前节点的SDS类型数据小于要查找的数据时,跳表就会访问该层上的下一个节点。
怎么避免死锁
资源有序分配法:即线程A和线程B获取资源的顺序要一样,当线程A是先尝试获取资源A,然后尝试获取资源B的时候,线程B同样也是先尝试获取资源A,然后尝试获取资源B。线程A和线程B总是以相同的顺序申请自己想要的资源
资料参考: