网站开发面向对象wordpress影视主题带采集

张小明 2025/12/29 11:45:02
网站开发面向对象,wordpress影视主题带采集,域名交易平台,国内国际时事写实记录20241、悲观锁、乐观锁和分布式锁的实现和细节 悲观锁#xff1a;认为线程安全问题一定会发生#xff0c;所以在操作数据之前先获取锁#xff0c;保证线程串行执行#xff0c;例如synchronized#xff0c;lock 细节#xff1a; 悲观锁适合插入数据 锁的粒度要尽量小#xf…1、悲观锁、乐观锁和分布式锁的实现和细节悲观锁认为线程安全问题一定会发生所以在操作数据之前先获取锁保证线程串行执行例如synchronizedlock细节悲观锁适合插入数据锁的粒度要尽量小只锁住需要串行执行的代码配合事务使用时要先提交事务再释放锁乐观锁认为线程安全问题不一定会发生因此不加锁只是在操作数据前判断是否有其他线程对数据做了修改如果没有被修改则说明线程安全更新数据反正说明出现了线程安全问题可以重试或者返回异常例如给表加字段versioncas操作细节乐观锁适合更新数据更新前要先查询version更新时比较version是否相同分布式锁满足分布式系统或集群模式下多进程可见且互斥的锁常见的实现有redis和zookeeperredis通常利用setnx方法细节锁的误删比如线程1拿到锁但是出现了阻塞导致锁自动释放在线程2拿到锁后执行业务逻辑时线程1反应过来继续执行最后将本已经不属于他的锁误删了锁的误删解决设置锁的唯一标识每个线程在获取锁时设置锁的value为线程唯一标识可以用uuid实现释放锁时判断锁的value是否跟自身线程唯一标识一致一致才能释放2、什么是死锁死锁产生的条件如何避免死锁死锁就是一组互相竞争资源的线程因为互相等待又互不相让资源导致永久阻塞无法进行下去的情况死锁产生的条件有四个互斥条件资源x和y只能分别被一个线程占用占有且等待线程t1占有资源x后等待资源y被释放同时自己不释放资源x不可抢占其他线程不能强行抢占线程t1占有的资源循环等待线程t1等待线程t2占有的资源线程t2等待线程t1占有的资源避免死锁的方法破坏对应的条件一次性申请所有资源破坏互斥条件占有资源的线程在申请其他资源时如果申请失败可以主动释放自己的资源破坏占有且等待条件按照顺序去申请资源然后反序释放资源破坏循环等待条件篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho3、ConcurrentHashMap底层原理ConcurrentHashMap是在HashMap的数据结构上增加了CAS操作和Synchronized互斥锁来保证线程安全并且使用volatile关键字修饰了node中的next和val字段来保证多线程环境下某个线程新增或修改节点对于其他线程是立即可见的。在进行添加操作时计算hash值定位该元素应该添加到的位置如果不存在hash冲突即该位置为null则使用CAS操作进行添加如果存在hash冲突即该位置不为null则使用synchronized关键字锁住该位置的头节点然后进行添加操作4、线程池的核心参数和执行原理线程池的核心参数有七个corePoolSize核心线程数maximumPoolSize最大线程数量核心线程救急线程的最大数量keepAliveTime救急线程的存活时间存活时间内没有新任务该线程资源会释放unit救济线程的存活时间的单位workQueue工作队列当没有空闲核心线程时新来的任务会在此队列排队当该队列已满时会创建应急线程来处理该队列的任务treadFactory线程工厂可以定制线程的创建线程名称是否是守护线程等handler拒绝策略在线程数量达到最大线程数量时实行拒绝策略 拒绝策略线程池执行原理5、线程池常见的阻塞队列常见的阻塞队列有ArrayBlockingQueue基于数组结构的有界阻塞队列FIFOLinkedBlockingQueue基于链表的有界阻塞队列FIFO两者区别链表与数组的区别ArrayBlockingQueueLinkedBlockingQueue底层是数组底层是链表强制有界默认无界传递容量参数后有界初始化时即创建好node对象数组插入时才创建node对象两把锁头尾一把锁LinkedBlockingQueue的优点是锁分离很适合生产和消费频率差不多的场景这样生产和消费互不干涉的执行能达到不错的效率6、线程池核心线程数如何确定没有固定答案先设定预期比如我期望的CPU利用率在多少负载在多少GC频率多少之类的指标后再通过测试不断的调整到一个合理的线程数公式分三种情况高并发任务处理时间短 ——》CPU核数1减少线程上下文切换并发不高任务处理时间长 IO密集型任务——》CPU核数*21读写多DB操作多CPU占用少并且IO数据传输时是不占用CPU的所以就可以多释放CPU资源给其他线程运行CPU密集型任务——》CPU核数1CPU占用高如计算任务视频解码任务这些任务线程上下文切换开销大所以要尽量减小开销提高CPU效率7、线程池的种类有哪些在JUC的Executor类中提供了多种创建线程池的方法主要有四种1、固定线程数的线程池核心线程数与最大线程数一样没有救急线程阻塞队列是LinkedBlockingQueue最大容量是Integer.MaxValue适合任务量已知相对耗时的任务2、单例线程的线程池核心线程数和最大线程数都是1没有救急线程阻塞队列是LinkedBlockingQueue最大容量是Integer.MaxValue适合按顺序执行的任务与单线程的区别是单线程运行完了就会销毁而线程池创建的线程运行结束不会销毁而是等待下一个任务可以重复使用减少了创建线程和销毁线程的时间提高资源利用率。3、可缓存的线程池核心线程数为0最大线程数为Integer.MaxValue救急线程存活时间为1分钟阻塞队列为SynchronousQueue不存储元素的阻塞队列每一个插入操作必须等待一个移除操作适合任务比较密集且任务执行时间短的情况因为使用的是救急线程在一定时间没有新任务后就会销毁节省资源同时能应付任务密集的时间段。4、可以定时执行的线程池核心线程数自定义最大线程数为Integer.MaxValue适合需要定时执行任务的场景8、线程池使用场景1、批量将pgsql数据导入ES计算数据总条数——》固定每页200条计算总页数N——》将页数N设置为CountdownLatch的count——》创建N个线程批量导入每次导入完调用countdown方法——》主线程中调用await方法线程都执行完后主线程结束2、异步调用用户搜索需要保存搜索记录但保存功能不能影响正常搜索——》搜索时通过线程异步调用保存记录功能关键注释EnableAsync加在SpringBoot启动类上Bean将自定义线程池注入到容器中核心8最大8 Async(线程池名称)加在需要异步调用的方法上9、对ThreadLocal的理解ThreadLocal内存泄漏问题ThreadLocal是java.lang包中的一个类它实现了线程之间的资源隔离让每个线程都有自己的独立资源ThreadLocal的底层实现的关键是它的静态内部类ThreadLocalMap每个Thread对象都有一个成员变量threadlocals它指向一个ThreadLocalMap该Map以ThreadLocal为key需要存储的线程变量为value当调用ThreadLocal的set()方法时会先拿到当前线程对象的ThreadLocalMap然后以当前ThreadLocal为key将变量存储到map中调用get方法和remove方法时也是通过这个key去操作。ThreadLocal内存泄漏问题回答这个问题我们首先要知道java中的四种引用强引用强引用是最常见的只要把一个对象赋值给一个引用变量那么这个对象就被强引用了强引用的对象只要不为null就不会被回收软引用软引用相对弱化一些需要用softReference对象构造方法去创建软引用当内存充足时软引用的对象不会被回收当不足时就会被回收弱引用弱引用又更弱了一些需要用weakReference的构造方法创建弱引用当发送GC时只要是弱引用的对象就会被回收虚引用虚引用要配合引用队列使用它的主要作用是跟踪对象垃圾回收的状态当对象被回收时通过引用队列做一些通知类工作在ThreadLocalMap中Key ThreadLocal是一个弱引用但是值value是一个强引用当垃圾回收时弱引用ThreadLocal会被回收而value不会这就导致value成了一个无法被访问也无法回收的变量造成内存泄漏解决办法当使用完ThreadLocal变量后及时使用remove方法进行清除。static class Entry extends WeakReferenceThreadLocal? {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal? k, Object v) {super(k);value v;}}三、JVM虚拟机1、JVM的主要组成部分及其作用类加载器将java字节码文件加载到内存中运行时数据区就是我们常说的JVM的内存我们的所有程序都被加载到这运行执行引擎负责将字节码翻译成底层系统指令然后交由系统执行本地方法接口与本地库交互实现一些基础功能2、运行时数据区的组成部分及其作用JVM运行时数据区由方法区元空间堆程序计数器虚拟机栈本地方法栈组成方法区/元空间方法区是一个线程共享的区域里面存储了类信息常量静态变量等待信息虚拟机启动时创建虚拟机关闭时释放内存无法满足分配请求时会报OOMErrorMetaspace堆Java堆是一个线程共享的区域里面存储了实例对象、数组等等内存不够时抛出OOM异常堆分为年轻代和老年代年轻代被分为三块eden区和两个严格相同的Survivor区老年代主要用来保存生命周期长的对象主要是老的对象程序计数器用来记录当前线程正在执行的字节码指令地址是线程私有的虚拟机栈虚拟机栈是java方法执行时的内存结构线程私有虚拟机会在每个java方法执行时开启一个栈帧用于存储方法参数局部变量返回地址操作数栈中间计算结果比如ij的值等信息当方法执行完毕时该方法会从虚拟机栈中出栈。本地方法栈本地方法栈是线程私有的为虚拟机使用的native方法提高服务如果栈的深度超过了虚拟机允许的最大深度就会抛出StackOverflowError异常 如果在扩展栈时无法申请到足够的内存就会抛出OutOfMemoryError异常。篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho3、垃圾回收是否涉及栈垃圾回收主要指的是堆内存栈帧内存在栈帧出栈后就释放4、栈内存越大越好吗每个虚拟机栈内存默认为1M不一定机器内存是固定的栈内存越大可以同时活动的栈帧就越少效率反而降低5、方法内部的局部变量是否线程安全只要局部变量没有离开方法的作用范围就是线程安全的如果局部变量引用了一个对象并且逃离了方法的作用范围就有可能线程不安全6、什么情况下会栈溢出栈帧过多比如太多层级的递归调用栈帧过大出现少7、堆栈的区别是什么1、存放内容堆中存放的是对象实例和数组该区域更关注的是数据的存储静态变量放在方法区静态对象仍然放在堆中栈中存放的是局部变量栈帧操作数栈返回结果等。该区更关注的是程序方法的执行。然而实际上对象并不总是在堆中进行分配的这里就需要介绍一下JVM的逃逸分析技术了。JVM会通过逃逸分析技术对于逃不出方法的对象会让其在栈空间上进行分配。2、程序的可见度堆是线程共有的栈是线程私有的。3、异常错误如果栈内存没有可用的空间存储方法调用和局部变量JVM会抛出java.lang.StackOverFlowError。而如果是堆内存没有可用的空间存储生成的对象JVM会抛出java.lang.OutOfMemoryError4、物理地址堆的物理地址是不连续的性能相对较慢是垃圾回收区工作的区域。在GC时会考虑物理地址不连续而使用不同的算法比如复制算法标记-整理算法标记-清除算法等。栈中的物理地址是连续的LIFO原则性能较快。5、内存分别堆因为是不连续的所以分配的内存是在运行期确认的因此大小不固定一般堆大小远远大于栈。栈是固定大小的所以在编译期就确认了。8、运行时常量池是什么和字符串常量池的区别运行时常量池是方法区的一部分它可以看做是一张表用于存放编译器生成的各种字面量和符号引用在类被加载时它的常量池信息就会被放入运行时常量池并且还会保存符号引用对应的直接引用。而字符串常量池是存放在堆里的在HotSpot虚拟机中它的底层是一个c的hashtable它将字符串的字面量作为key实际堆中创建的String对象的引用作为value。当创建一个String对象时会拿着字面量尝试在字符串常量池中获取对应String对象引用如果是首次执行就会在堆中创建一个String对象并保存到字符串常量池中然后返回。9、什么是直接内存直接内存不属于JVM内存是操作系统的内存常见于NIO操作用于数据缓冲区拥有较高的读写性能且不受JVM内存回收影响BIO同步阻塞IO发送请求后线程一直阻塞直到数据处理完并返回NIO同步非阻塞IO通过一个线程轮询大量socket当有socket准备就绪时通知客户端客户端调用函数接收。AIO异步非阻塞IO每个请求都会绑定一个Buffer通知操作系统去完成异步的读(这个时间你就可以去做其他的事情)读完之后会通知客户端来读取数据10、对象什么时候可以被垃圾回收如何标记垃圾当没有任何一个强引用指向对象时对象就可以被垃圾回收主流的虚拟机一般通过可达性分析算法分析一个对象是否能被回收也有系统采用引用计数法判断可达性分析算法1、算法主要思想是先确定一些肯定不能被回收的对象作为GCRoot GCRoot对象可以是虚拟机栈中引用的对象本地方法栈中Native方法引用的对象方法区中静态属性常量引用的对象2、然后以GCRoot为根节点去向下搜索找到它们直接引用或间接引用的对象3、在遍历完之后如果发现有一些对象不可达那么就认为这些对象已经没用用了需要被回收引用计数法就是为每一个对象添加一个引用计数器用来统计指向当前对象的引用次数一旦这个引用计数器变为0就意味着它可以被回收了。11、垃圾回收算法有哪些1、标记清除算法标记清除算法分为两个步骤标记-清除标记遍历内存空间对需要被回收的对象打上标记通常使用可达性分析算法清除再次遍历空间将被标记的内存进行回收缺点遍历两次效率低因为清除后没有进行整理容易形成碎片化不连续的的内存空间2、标记整理算法标记整理算法分为三个步骤标记-整理-清除标记同上整理将所有存活的对象压到内存的一端并按顺序排列清除掉其他空间缺点效率低速度慢3、复制算法将内存分为等大的两块每次只使用其中一块当触发GC时将存活的对象全部移到另一块内存的一端然后将当前内存空间一次性回收如此循环往复缺点内存利用率低12、什么是分代收集算法在java8中内存被分为两份新生代和老年代新生代内存使用复制算法老年代内存使用标记整理算法当对象在新生代内存中经历了一定的垃圾回收后它将被晋升到老年代。分代收集算法重复利用了对象生命周期的特点提高了回收效率大对象直接进入老年代什么是大对象呢这个是由jvm定义的参数值决定的但是这个参数只在Serial和ParNew垃圾收集器中生效 -XX:PretenureSizeThreshold当我们新分配的对象大小大于等于这个值就会直接在老年代中分配长期存活的对象将进入老年代在每个对象的头信息中都包括一个年龄计数器对象在经过一次minor gc之后如果仍然存活并且能够被 survior所容纳 那么这个年龄计数器就会加一当计数器的值达到了默认值大小一般默认值为15就会进入到老年代。对象动态年龄判断后决定是否进入老年代当survior区域的存活对象的总大小占用了survior区域大小的50%(可以通过参数指定)那么此时将按照这些对象的存活年龄从从到大排序然后依次累加当累加到对象大小超过50%则将大于等于当前对象年龄的存活对象全部挪到老年代。详细解释首先要知道Minor GC 和 Full GC的区别普通GC(minor GC)只针对新生代区域的GC指发生在新生代的垃圾回收动作因为大多数Java对象存活率都不高所以Minor GC非常频繁一般回收速度也比较快。全局GC(major GC or FullGC) 指发生在老年代的垃圾收集动作出现了Major GC经常会伴随至少一次的MinorGC(不是绝对的)。Major GC的速度一般要比Minor GC慢10倍以上。该算法将内存分为新生代、老年代、新生代中又分伊甸园、幸存区from、幸存区to对象创建之初会存在于伊甸园中当伊甸园满了之后会触发一次Minor GC伊甸园中还存活的对象会被转入幸存区from当伊甸园再次触发Minor GC时GC会扫描伊甸园和幸存区from对这两个区进行垃圾回收垃圾回收后幸存区from中还存活的对象利用复制清除算法复制到幸存区to如果有对象的年龄达到了老年代区则复制到老年代区复制完之后把幸存区from清除掉之后把from区和to区交换位置from变toto变from保证幸存区to为空最后把伊甸园中存活下来的对象放入幸存区from如果有对象的年龄达到了老年代区则复制到老年代区同时把这些对象的年龄1即可。篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho13、垃圾收集器有哪些串行收集器GC时只会有一个线程在工作Java应用中的线程都要STW等待垃圾回收结束并行收集器GC时会有多个线程参与垃圾收集Java应用中的线程都要STW等待垃圾回收结束JVM默认CMSConcurrent Mark Sweep收集器并发收集器进行垃圾回收时不会暂停Java应用线程STW时间短CMS收集器采用的是标记清除算法所以不需要移动存活对象的位置GC可以和Java应用程序同时运行G1Garbage-First收集器基于区域划分的收集器适用于大内存应用。14、什么是G1垃圾收集器G1是JDK9默认的垃圾收集器,代替了CMS收集器。它的目标是达到更高的吞吐量和更短的GC停顿时间。G1垃圾回收器将堆内存划分为多个区域每个区域都可以充当EdenSurvivoroldhumongous专为大对象准备G1垃圾回收过程可以分为几个主要阶段1、初始标记标记GCRoot直接关联的对象需要STW2、并发标记对GCRoot开始对堆中对象进行并发标记需要STW3、重新标记解决一些漏标错标问题需要STW4、混合收集将不需要回收的edenSurvivor对象放入新的Survivor区old对象放入新的old区如果Survior对象达到老年年龄后也会放入新old区。然后将区域内存回收要注意的是混合收集不会处理所有区域而是根据停顿时间目标去筛选出回收价值高存活对象少的区域。15、什么是类加载器类加载器有哪些类加载器是一个负责加载类的对象因为JVM虚拟机只能运行二进制文件类加载器的作用就是将字节码文件加载到JVM中运行。JVM中有三个内置的类加载器BootStrapClassLoader启动类加载器最顶层的加载器由C实现主要用来加载Java的核心类裤JAVA_HOME/libExtensionClassLoader(扩展类加载器) 主要负责加载JAVA_HOME/lib/ext下的扩展类AppClassLoader(应用程序类加载器) 主要负责加载ClassPath下的类也就是开发者自己写的Java类另外还有自定义ClassLoader通过继承ClassLoader实现。16、什么是双亲委派模型为什么类加载采用双亲委派当一个类加载器尝试加载一个类时会先委托上一级加载器去加载如果上一级还有上级就会委托上一级的加载器的上级去加载如果所有上级加载器都不能加载该类则类加载器尝试自己加载类。作用1、防止重复加载防止已经在上级加载器中加载的类重复地被子加载器再次加载2、为了安全防止核心类库API被篡改3、保证类的一致性17、类装载的执行过程是怎样1、加载加载过程需要完成三步通过类的全限定名来获取类的二进制流解析类的二进制流为方法区的类数据结构Java类模型在堆中创建一个该类的Class对象作为方法区中该类的数据访问入口。2、验证验证类是否符合JVM规范①文件格式验证②元数据验证③字节码验证④符号引用验证检查符号引用对应的类或方法是否在常量池中存在3、准备该阶段为类的静态变量分配内存并设置初始值这里所说的初始值“通常情况”下是数据类型的零值4、解析将常量池的符号引用替换为直接引用符号引用以一组符号来描述所引用的目标有时候JVM不知道引用的类或者方法内存地址在哪于是就先用符号引用代替直接引用直接引用直接指向目标的指针5、初始化对类的静态变量静态代码块进行初始化操作//6、使用使用类执行代码//7、卸载用户代码执行完毕后销毁Class对象18、用于JVM调优的参数有哪些1、设置堆空间大小-Xms 512m 设置初始化大小默认是物理内存的1/64-Xmx 1g 设置最大大小默认是物理内存的1/42、虚拟机栈大小-Xss 256k 默认1M3、年轻代eden区和survivor区大小比例-XXSurvivorRatio 8 表示eden区survivor区8:24、年轻代晋升到老年代阈值-XX:MaxTenuringThreshold10 默认为155、设置垃圾回收器-XX:Use[垃圾回收器名]19、JVM调优的工具有哪些命令jsp 进程状态信息Jstack 线程内的堆栈信息Jmap使用较多 查看堆的信息堆的大小配置堆内存各部分的使用情况jstat 垃圾回收信息工具jconsole用于对JVM内存线程类的监控visualVM用于对JVM内存线程类的监控20、Java内存泄漏的排查思路首先通过jmap命令或者设置JVM参数区获取dump文件然后将dump文件放入VisualVM中去分析通过查看堆的信息定位到哪行代码出了问题然后再去修改代码21、CPU彪高排查方案与思路1、使用top命令查看哪个进程CPU使用率较高2、使用ps H -eo pid,tid,%cpu | grep 进程id 命令查看进程中的线程状态3、找到关键线程然后使用jstack命令去查看进程中哪个线程出了问题然后找到对应代码并修改四、Mysql数据库1、InnoDB和MyISAM的区别和使用场景事务InnoDB支持事务而MyISAM不支持外键InnoDB支持外键而MyISAM不支持锁InnoDB支持行级锁并发量高和表锁MyISAM只支持表锁索引InnoDB不支持全文索引MyISAM支持全文索引全文索引是基于分词的索引能更快速地在文本中检索一段信息内容使用场景InnoDB适合需要高并发或事务的场景MyISAM适合读操作远远大于写操作且不需要事务的场景属性InnoDBMyISAM事务支持事务不支持事务外键支持外键不支持外键锁支持行锁并发更高和表锁只支持表锁不会死锁索引不支持全文索引支持全文索引查询更快适用场景并发量高或者需要事务读远多于写且不需要事务2、如何防止sql注入在编写sql语句时使用参数传递的方式去给变量赋值而不是直接嵌入到sql语句中在mybatis的mapper中我们可以用#{value}的方式去传递参数防止sql注入。3、怎样实现幂等幂等也就是相同条件下对一个业务的操作,不管操作多少次,结果都是一样实现方案唯一索引通常是主键乐观锁通常是version字段tokenredis令牌-缓存tokentoken是服务端生成的一串字符串当客户端登录后服务端将token作为令牌发送给客户端之后客户端访问服务端时只需要校验token即可不需要再验证用户和密码redis作为缓存保存令牌到服务端。4、一条sql语句的执行流程Mysql分为server层和存储引擎层建立连接server层的连接器验证客户端发来的用户名和密码是否正确如果错误就返回错误提示如果正确就校验用户的权限查询缓存当执行sql查询语句时mysql会先去缓存中查询是否有记录如果有记录就直接返回没有的话就去数据库中查询然后将查询记录记录到缓存中分析器分析器的作用是对sql语句进行词法分析和语法分析词法分析就是对sql语句中的关键词进行分析比如查询到select关键词就知道这是一条查询语句此外还会分析被操作的表条件语句的字段等语法分析就是判断这条语法是否正确。优化器对sql语句进行优化执行器调用存储引擎的接口执行sql语句执行之前会判断一下有没有权限5、Mysql的事务特性ACID原子性单个事务是不可分割的最小工作单元事务中的所有操作要么全都执行成功要么全都执行失败。通过undolog日志解决一致性数据库总是从一个一致性的状态转换到另外一个一致性的状态。如果事务成功完成那么所有变化都将成功应用如果失败就会回滚到原始状态。通过undolog日志解决持久性一旦事务提交则其所做的修改就会永久保存到数据库中。此时即使系统崩溃修改的数据也不会丢失。通过redolog日志解决隔离性事务与事务之间互不影响。通过加锁实现6、 Mysql事务的隔离级别脏读、不可重复度幻读。脏读事务读取到了未提交的数据比如A查询到了B修改了但未提交的数据不可重复读事务对同一内容的两次查询结果不一致比如A查询到数据不存在B插入并提交A再次查询时发现存在幻读事务在插入前检查到数据不存在插入时却发现数据已经存在无法插入比如A发现数据不存在准备插入但B此时插入数据并提交不可重复读重点在于update而幻读的重点在于insert或delete。Mysql事务的隔离级别从低到高为读未提交RC所有的事务都可以读取其他事务未提交的结果会发生脏读不可重复读幻读读已提交RU事务开始时只能读取到已提交的修改会发生不可重复读幻读可重复读RR事务开始时在同一条件的查询返回的内容是一致的会发生幻读mysql默认隔离级别可串行化所有事务依次执行事务之间不能互相干扰能防止脏读不可重复读幻读7、 锁的类型行锁和表锁共享锁和独占锁锁的类型是否会死锁并发量适用场景表锁不会死锁并发量低1、读多写少上一次锁连续读2、写特别多如果用行锁会导致其他事务长时间锁等待锁冲突频率变高行锁会死锁并发量高并发量高的场合页面锁会死锁并发量中行锁行锁就是加在单行上的锁只存在于InnoDB引擎中分为共享锁读锁和独占锁写锁类型作用共享锁读锁获得共享锁的事务被允许读一行并阻止其他事务获得该行的独占锁独占锁写锁获得独占锁的事务被允许写一行并阻止其他事务获得该行的共享锁和独占锁读锁和写锁的共同点自动加锁不同点共享锁可能会死锁独占锁不会 / 读锁读取数据后释放写锁要事务结束后才释放语法SELECT...LOCK IN SHARE MODE / INSERT...FOR UPDATE此外还有意向共享锁和意向独占锁这是InnoDB自动添加的事务在获取读锁和写锁前必须先获取该表的对应意向锁。表锁表锁是加在整个表的锁表锁也有两种锁共享锁和独占锁作用与行锁的基本相同​语法LOCK TABLE {TABLENAME} READ / LOCK TABLE {TABLENAME} WRITE8、内关联全关联左关联右关联的区别内关联INNER JOIN所有的查询结果在关联的两张表中都有记录全关联联结了那些在相关表中没有关联的行分为左关联和右关联左关联LEFT JOIN从From子句的左边表中选择所有行可以没有右边的表的行左关联RIGHT JOIN从From子句的右边表中选择所有行可以没有左边的表的行篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho9、索引索引的分类索引的作用相当于是图书的目录它是对数据表中一列或多列值进行排序的一种存储结构索引的分类普通索引主键索引复合索引唯一索引外键索引全文索引普通索引mysql表中最基本的索引语法CREAT INDEX index_name ON TABLE table_name(column)主键索引在Mysql创建表指定主键的时候会自动在主键上建立一个主键索引标志着主键具有唯一性且不为空复合索引复合索引也叫组合索引在建立索引的时候使用表中的多个字段就比如说使用身份证号和手机号建立索引语法CREAT INDEX index_name ON TABLE table_name(column1,column2)唯一索引唯一索引标志着该字段具有唯一性语法CREAT UNIQUE INDEX index_name ON TABLE table_name(column)如果创建表的时候加索引语法为CREATE TABLE tablename(propname1 type1,……propnamen type..n,UNIQUE INDEX|KEY index_name (column [(length)] [ ASC | DESC ] ) );//简化为UNIQUE INDEX index_name (column);10、索引的优缺点和使用规则索引的优点主要体现在提高了用户查询的速度提高了性能降低了查询中分组和排序的时间加速表与表之间的连接通过索引的唯一性可以确保表中数据的唯一性索引的缺点主要体现在空间索引占用了磁盘空间时间当数据量较大时索引的创建和维护也是非常耗费时间的每次对数据进行增删改查时索引也要进行动态维护降低了数据的维护速度总结以下条件不适合添加索引在查询中很少使用的列数据值很少的列写操作远多于读操作的列修改频率大于查询频率的列使用索引的规则对查询频率高的字段创建索引对经常需要分组、排序和联合操作的字段创建索引尽量使用唯一索引多使用短索引索引的数目不要不多不然会降低增删改的效率11、索引的原理B树的优点首先我们了解一下B树Balance Tree即平衡树的意思下图即是一颗B树​B树的每一个节点代表一个磁盘块每一个节点上面存储了多个键值对和指针B树相对于平衡二叉树每个节点存储了更多的键Key和数据Data并且每个节点拥有更多的子节点子节点的个数就是B树的阶数比如上图就是的B树就是三阶B树基于这个性质B树查询数据读取磁盘的次数会减少查找的效率会比平衡二叉树高。B树是对B树的进一步优化下图是一颗B树​在B树中非叶子节点不会存储数据Data只会存储键值Key而所有的数据都存储在叶子节点上并且所有数据都是按照顺序排列的在数据库中页节点的大小是固定的InnoDB默认为16kb页如果不存储数据就可以存储更多的键值树的阶数会提升这样一来我们查询数据访问磁盘的次数会进一步减少查询的效率更高根节点默认存储在内存所以我们访问一次三阶B树索引的数据只需要2次磁盘IO因为B树索引中所有的数据都存储在叶子节点上并且按顺序排列所以对数据的范围查找分组排序都会更加简单MyISAM中的B树索引实现与innodb中的略有不同。在MyISAM中B树索引的叶子节点并不存储数据而是存储数据的文件地址。B树相对于B树的特点只有叶子节点才会存放数据非叶子节点只存放索引B树中每个节点都通过双向链表连接叶子节点中的数据通过单向链表连接非叶子节点中的索引会出现在子节点中而且是子节点中索引的最大最小值非叶子节点的索引树子节点数
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

哪些网站做的比较好看哪些网站做黑名单

123云盘会员解锁终极指南:5分钟免费开启完整VIP特权 【免费下载链接】123pan_unlock 基于油猴的123云盘解锁脚本,支持解锁123云盘下载功能 项目地址: https://gitcode.com/gh_mirrors/12/123pan_unlock 还在为123云盘的下载限速而烦恼吗&#xff…

张小明 2025/12/29 11:44:30 网站建设

大型企业网站源码做网站教程视频

第一章:Open-AutoGLM 2.0原理Open-AutoGLM 2.0 是新一代开源自动语言生成模型,专为复杂任务编排与多轮语义理解设计。其核心架构融合了图神经网络(GNN)与增强型 Transformer 解码器,通过动态推理链机制实现上下文感知的…

张小明 2025/12/29 11:42:50 网站建设

readme.md做网站网站备案登记

一、实验准备:1、Metaspolitable2(靶机)2、kali二、实验步骤:1、打开kali和靶机,两者都要处于NAT模式2、在终端使用命令(ip addr)查看kali的ip 然后nmapkali IP,得到靶机ip3、执行nmap -sV (靶机…

张小明 2025/12/29 11:42:16 网站建设

手机进入网站自动识别网站开发阶段

一、关键词学生管理系统、学籍管理系统、教务系统、选课系统、成绩管理系统二、作品包含源码数据库万字设计文档全套环境和工具资源本地部署教程三、项目技术前端技术:Html、Css、Js、Vue3.2、Element-Plus后端技术:Python、Django、PyMySQL四、运行环境…

张小明 2025/12/29 11:41:43 网站建设

哪个网站可以免费制作h5软文代写代发

NVIDIA Profile Inspector终极指南:显卡性能调校与游戏优化完全攻略 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 还在为游戏卡顿、画面撕裂而烦恼吗?想让你的NVIDIA显卡发挥出…

张小明 2025/12/29 11:41:09 网站建设

wordpress文章模板代码网站搜索引擎优化诊断

第一章:你还在混用Open-AutoGLM和SoapUI?这5个协同盲区可能正拖垮项目进度在现代API开发与测试流程中,Open-AutoGLM作为新兴的自动化代码生成工具,常被用于快速构建接口逻辑原型,而SoapUI则广泛应用于功能与性能测试。…

张小明 2025/12/29 11:40:36 网站建设