查缺补漏

84 阅读1分钟

一、

update user set money = '1000000' where username = '23456';

当username不是索引时,该sql上的是表锁,当username是唯一索引时,则上相应行的行锁即可。

二、 分布式锁场景:比如 同一个手机号+用户账号+...组成一个唯一索引 setnx为分布式锁。可以防止用户下两个订单。
分布式锁解锁失败怎么办?1、重试 2、设置了过期时间,等着就行了,业务场景也决定了可以等着。3、换zk

三、threadlocal内存泄漏问题 Thread类里面的ThreadlocalMap里面的entry的key是弱引用threadLocal对象,value是强应用指向真实的线程本地要存储的对象。如果threadlocal的外部引用没有了的话,那么如果是key的强引用指向threadlocal对象的话,那么这个threadlocal对象就永远get不到了,也就不会被回收。 解决办法就是把这个key改成弱引用,当下一次垃圾回收扫描到他的时候就会把这个threadlocal对象回收。这时就存储了<null,真实value>的entry。等下一次调用map的get(),set(),remove()方法的时候,就会把key为null的entry回收了。

四、Mysql插入一条数据的时候会怎么样?

1、如果插入位置有垃圾链表,且数据长度一致的话,可以直接复用
2、如果插入的页已经满了,就要把该页进行页分裂,而不是将所有数据后移。页分裂会造成性能损耗,如果想避免这种无谓的性能损耗,最好让插入记录的主键值递增。