自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(131)
  • 收藏
  • 关注

原创 Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器

1、SpringWeb是Spring框架中的一个模块,是基于ServletAPI构建的web框架,是Spring为web层开发提供的一套完备的解决方案。2、在web层框架经历了Strust1,、WebWork、Struct2等诸多产品的历代更迭之后,业界普遍选择SpringWeb作为JavaEE项目web层开发的首选方案。SpringWeb中的拦截器(Interceptor)类似于 Servlet 中的过滤器(Filter)// 定义拦截器@Override。

2024-12-21 01:24:46 1498

原创 Spring(二)AOP、切入点表达式、AspecJ常用通知的类型、Spring中的事务管理

AOP是Aspect Oriented Programming的缩写,意为面向切面编程,是一种将非业务代码和业务代码进行分离的一种思想。在实际开发中,有许多重复性的操作,例如事务提交、权限认证、保存日志等,需要在业务代码中重复被调用。面向切面编程,就是对非业务代码进行抽取,然后在不修改原有代码的前提下,为业务代码添加额外的功能。AOP底层使用的是动态代理技术,让一个代理对象,帮助我们调用非业务代码。数据库事务是对数据库一次执行的若干操作所进行的管理。

2024-12-18 12:05:46 1015

原创 Spring(一)概述、IOC、在Spring中对bean进行管理、在Spring中对数据访问层进行管理、在Spring中集成MyBatis

Spring是一个轻量级的IOC和AOP的一站式的Java开发框架,是为了简化企业级应用开发而生的。在Spring框架中,将原本在程序中手动创建对象的控制权反转给了Spring框架,让Spring框架来负责对对象的管理,具体的管理内容包括对象的创建、对象的初始化、对象功能的增强、对象与对象之间的依赖关系和对象的销毁,这个行为就被称为IOC(控制反转),我们在哪里需要使用对象,直接从Spring框架中获取即可。

2024-12-17 21:35:12 815

原创 java中的泛型-泛型(引入、概念、表示、使用、优点、注意事项)、泛型类、泛型接口、泛型擦除

return key;// 泛型类的使用:在创建对象时给泛型类和构造方法的泛型类型参数传入相同的具体类型,可以省略对构造方法传入具体的类型相同泛型// 子类对象调用从父类中继承过来的方法时方法中的泛型类型是确定的泛型相同@Overrided.print("你好,世界");

2024-11-26 00:48:03 1308

原创 java反射(概念、作用、API)、java类的Class对象的创建、使用

/ 使用Class对象创建java类对象。

2024-11-24 15:54:54 1045

原创 MyBatis-数据库连接池、属性文件config.properties、类名简化、MyBatis的整体架构

1、MyBatis对jdbc中的接口(如Connection、PreparedStatement)进行了封装,并提供了一些自己的类,如。2、SqlSession对象是为实现一次与数据库交互创建的对象,具有管理事务、管理缓存的功能,每。接收SqlSessionFactory创建的SqlSession对象的SqlSession类。中,将SQL语句与java语句进行了分离,为动态SQL的实现奠定了基础。注意:系统类常用的一些类mybatis框架已经提前为其起好了别名。存储实现创建好的连接对象的容器。

2024-11-23 17:08:10 630

原创 MyBatis-缓存(一级缓存、二级缓存)

2、实现原理:两个不同的SqlSession对象执行同一个namespace下的相同Mapper方法中的包含传递参数在内的完全相同的SQL语句时,第一个SqlSession对象在执行完后会将从数据库中查询到的数据写到二级缓存中,第二个SqlSession对象在执行SQL语句时会直接从二级缓存中获取数据,提高了查询效率。(1)二级缓存是SqlSessionFactory级别的,是更具Mapper中的namespace划分区域的,相同的namespace的Mapper查询的数据缓存在同一个区域,如果使用。

2024-11-23 10:09:36 1008

原创 MyBatis框架-动态SQL-XML中的常用标签+特殊字符在XML中的显示

如果不添加and关键字,如果只有条件二和条件三成立,那么得到的SQL语句的两个查询条件之间没有关键字进行连接,这条SQL语句为不正确的SQL语句。(1)set标签:set标签的作用是当set标签中有结果返回时会在返回结果的开头加上set关键字并且去除返回结果末尾的逗号。一、if标签、where标签、trim标签、choose标签、set标签、foreach标签。A、当where标签中的if标签的条件只要有一个成立,会在SQL语句的查询条件最前面。if标签里面的内容是条件成立时添加到SQL语句中的字符串。

2024-11-22 13:45:49 988

原创 iterator的使用+求数组中的第n大值+十大经典排序算法

(1)存在问题:数组【1,2,3,4,5,6】也要进行一次冒泡排序。1、删除0到101中可以被2、被3、被5整除的数字。将一个数组中的最大元素不断放在数组中的最后一个位置。2、求一个数组中的第三大值(不能使用排序)四、求一个数组中的第n大值(n为2或者3)1、求一个数组中的第二大值(不能使用排序)(2)方法二:使用iterator删除。(1)方法一:使用for循环遍历删除。不断将数组中的最大元素放在第一个位置。一、iterator的用法。

2024-10-04 15:45:38 958

原创 认识Hash表+Hash函数的设计+Hash冲突的处理+Hash表的实现+Java中的equals与hashCode

Hash表(1)如果a.equals(b)返回true,那么a和b的hashCode()必须要相等(2)如果a.equals(b)返回false,那么a和b的hashCode()有可能相等也有可能不相等(3)两个对象相等的必要条件是两个对象的hashCode()相等(4)使用hashCode和equals来共同判断两个对象是否相等。

2024-09-28 11:04:21 752

原创 6种常见位运算符+异或运算符的使用(加密、解密)

位运算符进行的是整数与整数之间的运算。

2024-09-24 22:19:25 420

原创 BitSet-解决数据压缩问题

1、为了满足使得数据占用的内存更小,可以采用映射的思路,按照某种规则对歌名建立对应的索引,将索引存放在内存空间中,将音乐存放在外部存储器中(硬盘、磁带、光盘)。举例:1个Byte有8个bit,索引位置为5、2、1的位置bit位为1,因此该Byte存储了5、2、1三个数字,Java中二进制的最高位为符号位,不能够进行使用。(2)但是如果使用int类型的字节上的位为0或者为1来用对应位置上的索引来表示所存储的数字,这将会极大地降低对内存的占用。一方面,只在内存中存放索引,将会减小内存的使用;

2024-09-24 22:17:32 464

原创 使用红黑树实现Map

三、RBTNode类(红黑树节点)一、Color类(节点颜色)五、TestRBT(测试)二、Pair类(键值对)四、RBT类(红黑树)

2024-09-23 18:59:32 275

原创 2-3树、红黑树的定义、红黑树的特性、红黑树的实现(添加+查询)、树的演变

(2)于是我们引入了新的数据结构2-3树,我们引入了3-节点(两个键和3条链接),而且还保留了标准的二分查找树中的节点2-节点(一个键2条链接),每个节点的。红黑树的实现代码看Map底层的红黑树是最标准的,但是想要理解非常困难,在这里我将用一种简化的方式去实现红黑树,使得红黑树具有添加节点和查找节点两个功能。4、不用二叉树作为存储数据库索引的数据结构的原因是二叉树的高度会太高,会造成太多的io操作(从硬盘中查询指定索引的数据)(4)特性四:如果一个节点是红色的,则它的两个子节点必须是黑色的。

2024-09-23 18:59:14 1209

原创 使用AVL树实现Map

3、数组------》链表(数组转为链表是为了充分利用内存空间)------》BST(AVL(缺点是在插入节点时需要大量调整))------》RBT。一、数组在裂变扩容时可能会出现环、在数组元素转为链表之后选择尾插法插入节点、数组到链表到AVL到RBT的转换。1、节点:K和V,一对看,Pair(K,V)、height、left、right。解决方案:用删除节点的右子树的最小节点替换掉删除节点。2、情况二:删除节点的左节点为空右节点不为空。3、情况三:删除节点的左节点不为空右节点为空。

2024-09-22 18:29:18 915

原创 自定义类是否能正常运行、类加载器、JIT

Car.class文件---->>父-->>爷(检查发现Car.class文件对应的类信息已经有了,Car.class文件不用再加载进入内存)---->>父---->Car.class文件。Car.java源文件--------->>Car.class字节码文件---------->>new 了一下,准备进内存了--------->>经过。的判定看Car.calss文件是否需要加载到内存中------->>将变量和方法分到合适的内存位置上去------>>实例化new出真正的对象。

2024-09-22 18:28:37 316

原创 线段树-认识线段树+实现线段树

(3)如果我们每进行一次加值的操作,就将全部线段树更改一遍,时间复杂度会很高,因此,我们需要进行一个延迟加和的操作。(1)优化代码的思想:要做一件事情的时候,先将这件事情攒着,当到达某一时间点的时候,把攒着的事情一块一做。5、更新线段树中每个节点的sum属性的值(即给原来的每个数组元素的值都加上。(4)具体思路:如果【left,right】区间增加a,在查询时,就。(2)在线段树中,pushDown()方法用于实现。缺点:不能将所有节点的sum属性的值全部正确更新。二、线段树的实现(放数据、查数据)

2024-09-21 19:33:23 460

原创 堆-使用offer创建堆和使用heapify创建堆的时间复杂度+堆排序

2、使用heapify创建堆(堆化):时间复杂度为。1、使用offer创建堆:时间复杂度为。一、创建堆的时间复杂度比较。,其中n为满二叉树的结点数。,其中n为满二叉树的结点数。

2024-09-21 19:31:48 268

原创 二叉搜索树的判断+平衡二叉树的判断

二叉树 二叉树 二叉树 二叉搜索树。满二叉树 平衡二叉树 二叉搜索树。平衡二叉树(通过判断平衡因子是否超过1)1、判断二叉树是否是。2、判断二叉树是否是。

2024-09-15 10:41:22 245

原创 两个常用Map(LinkedHashMap和ConcurrentHashMap)+Map集合的遍历+Map集合中常用方法(getOrDefault()、putIfAbsent()和merge())

三、Map集合中的getOrDefault()、putIfAbsent()和merge()2、方法二:使用value的Collection集合遍历。(1)特点:元素被放入的顺序与元素被遍历取出的顺序一致。1、getOrDefault():Map集合中。2、putIfAbsent():Map集合中。3、方法三:使用Entry的Set集合遍历。1、方法一:使用key的Set集合遍历。(1)特点:单独拿键值,单独拿值。3、merge():Map集合中。则将此新键值对添加到Map集合中。

2024-09-10 20:55:53 301

原创 堆-数组的堆化+优先队列(PriorityQueue)的使用

1、在获取堆顶元素和删除堆顶元素的方法中,都必须返回堆顶元素,当堆为空时,返回异常对象要比返回null关键字更加安全。当数组中的元素连续多次进行排序时会消耗大量的时间,将数组变成堆后通过堆排序的方式将会消耗更少的时间。,即对数组进行堆化,这将会避免由于数组容量不足所带来的索引越界问题。以完全二叉树的形式将元素存储到对应的数组位置上所形成的新数组。的方式,但是由于不知道到底数组大小要扩到什么程度,因此会。通过逐个添加元素创建堆的方式来创建堆的时间复杂度为。的问题,为了解决索引越界的问题,我们可以采用。

2024-09-07 18:08:58 385

原创 堆(逐个添加元素创建堆)-堆结构的创建+堆结构的实际应用

数组对象(即将数组元素以特殊完全二叉树的形式在数组中进行存储的,特殊在子父结点在数组中的索引会满足一定的数学关系/即元素在数组中存储,但以完全二叉树结点的规律进行使用)一棵完全二叉树(将堆数组中的元素从前向后按照完全二叉树的形式从上向下从左到右进行排列即可得到堆数组等效的完全二叉树)1、数据结构解决的是数据的存储问题,算法解决的是存储了的数据的使用效率问题。(3)父结点索引=(子结点索引-1)/2(除根结点外,根结点没有父结点)(4)构建堆的本质就是利用堆的方式将数组中的元素在数组中进行重新排列。

2024-09-06 17:26:12 731

原创 MyBatis框架处理一对多关系表中关联数据的方式(一次查询法和嵌套查询法)+使用注解标签写SQL+两个标签(association标签和collection标签)

解决数据错误问题的方式:为类中不能与数据库对应结果表的列名进行自动映射的基本属性添加自定义映射,为类中与其嵌套属性中的属性同名的基本属性添加自定义映射,为类中的嵌套属性中的所有属性都添加自定义映射,嵌套属性中的所有属性都要被查询。举例:查询指定id的学生的信息及其专业和操作人的信息(先查出主表的数据再通过查询出来的外键查出关联表中的数据,逐级实现数据的封装)(1)property属性:其值是resultMap标签的返回值类型中的嵌套属性的属性名。

2024-09-04 11:37:28 1081

原创 接口-认识接口+定义接口的基本语法+接口的特点+(具体类、抽象类、接口)的对比和使用场景

解析:USB接口提供了尺寸、接电源、传输数据等一系列标准,各个厂家根据USB接口提供的一系列标准生产出了各种具有一定功能的USB产品,比如:USB风扇用于接电源后吹风,U盘用于接入USB接口后传输数据。(3)举例:在接口中只能定义静态常量、抽象方法、静态方法(jdk8及以后)、默认方法(jdk8及以后)(1)类通过使用implements关键字来实现接口(那么实现这个接口的类就是这个接口的实现类)。使用USB接口——————>通过多态的方式使用USB接口。实现USB接口——————>实现所有方法。

2024-08-24 13:21:15 1000

原创 面向对象语言特征-多态+final关键字(修饰类、方法参数、成员方法、成员变量)

1、不足之处:为了实现多态,我们将子类类型向上转为了父类类型(引用类型之间的转换,分为两种,子类型向父类型转换的隐式类型转换和父类型向子类型转换的强制类型转换,但是要注意,引用类型之间的转换只存在于父类型和子类型之间),但是子类类型一旦上升为父类类型,那么就。,只需要定义一个方法,就可以定义多个不同的子类,遵循了面向对象设计原则-开闭原则(扩展开放,修改关闭),instanceof关键字前面必须是父类的引用,后面要么是子类的类型,要么是任意的接口名。

2024-08-23 15:07:54 1017

原创 抽象类与抽象方法

如:在上层定义用户操作类这个抽象类,在这个类中定义增删改查四个方法,让普通用户操作类和vip用户操作类去继承这个抽象类,并实现里面的四个方法。(3)继承抽象类的非抽象类要么实现其中所有抽象方法(已实现方法的参数和返回值必须和抽象类中的方法一样),要么该类被声明为抽象类。(1)在定义抽象方法时不能添加static关键字,因为加了static关键字在编译时会报错(静态方法不能被修饰为抽象方法)(4)抽象类、抽象方法,在软件开发过程中都是设计层面的概念。的方法(只能是非静态的成员方法)(声明+实现=定义)

2024-08-21 17:25:10 666

原创 面向对象语言特征-继承(基本语法+方法的重写+super关键字(成员变量、成员方法、构造方法))+成员变量与局部变量的对比(定义位置、权限修饰、初始化、生命周期、内存位置)

(1)this.eat()与eat()作用相同,在子类中的成员方法中使用eat()调用eat()时,子类中有则会调用子类中的eat(),子类中没有则会在直接父类中进行寻找(默认直接父类中是有的),调用父类中的eat()3、在子类XTQ的成员方法(非静态的)中调用直接父类中静态的成员方法stand()时,stand()、this.stand()、super.stand()三者的作用是等效的,调用的都是。(4)子类重写方法中抛出的异常的类型必须是父类被重写方法中抛出的异常的类型的子集。

2024-08-18 18:24:50 603

原创 访问权限修饰符(public、protected、private)、封装(私有化类属性、私有化类的某些方法)

如:单例模式:单个实例,在系统中,想让某个类只能创建一个对象(如计算机电脑上的任务管理器在Windows系统下只能创建一个)(1)修饰对象:类(包括正常类和内部类)、成员变量、方法(包括构造方法和成员方法)(1)修饰对象:类(包括正常类和内部类)、成员变量、方法(包括构造方法和成员方法),必须通过类中提供的方法来实现对隐藏信息的操作(赋值)和访问(取值)(2)权限范围:被修饰对象只能在本类、同包类、不同包子类中被访问。(1)隐藏了类的某些信息,保护了类中属性的数据值。

2024-07-18 11:16:11 4033

原创 this关键字、static关键字(静态变量、静态方法、静态代码块)、代码块、包

4、注意:在一个类的定义中,方法或代码块中等号左边的变量如果加了this,则该变量为成员变量,等号左边如果没有加this,则该变量如果在该方法或代码块的作用域中定义,则该变量为局部变量,否则为成员变量。(3)第三级:表示项目的名称,如bcms(业务连续性管理系统),oa(办公自动化),erp(企业资源计划),cms(内容管理系统)等。(1)静态成员信息与类信息(类对应的class文件/类的静态代码)一样,在内存中只有一份,都在类模版中,而类模版在JVM的方法区中。(1)第一级:表示项目类型。

2024-07-17 16:57:43 851

原创 Java中变量的分类、构造方法、方法的重载、对象与引用、参数传递

(1)如果某类方法出现了方法重载的现象,当调用该类方法时,编译器会查看调用方法时使用的参数数量、参数顺序和参数类型,然后与类中定义的重载方法进行匹配,找到参数匹配的重载方法进行调用。(1)基本数据类型,整数型的默认值是0,浮点型的默认值是0.0,布尔型的默认值是false,字符型的默认值是‘\u0000’(空字符,NUL字符,null字符)(3)特点:由于实参和形参指向的是同一地址,在方法执行中对形参的操作实际上就是对实参的操作,操作结果会在方法结束后被保留下来,所以。,编译器会自动生成一个无参构造方法。

2024-07-15 15:01:54 1080

原创 Java中的类与对象

(2)new Car():使用关键字new 根据后面构造方法的名字来找到对应的类模版创建一个对象,并在内存中开辟一块独立的存储空间用来存放所创建对象的信息,然后调用Car类的无参构造方法初始化在内存中创建好的对象。(1)使用对象名.成员变量名或对象名.成员方法名来访问对象成员,包括成员变量和成员方法。(3)类的源代码存储在.java文件中,类的编译后的字节码存储在.class文件中。编程是对现实生活中事物的体现,是对现实生活中事物所进行的抽象定义,因此在程序中。,用来静态地定义某一类事务具有的属性和行为。

2024-07-10 21:22:37 907

原创 定义变量和声明变量、定义类和声明类

在这个例子中,'Person'类的定义包含了访问权限修饰符public、类名Person、成员变量age、构造方法Person()、方法oper()这5个必要元素,这个类的定义同时是这个类的声明,因为它提供了类的全部信息。(3)前向声明:只声明不定义变量的声明变量的方式,它允许编译器知道变量的存在,以便在后面的代码中正确地引用该变量。(2)定义变量是在声明变量的基础上,为变量分配内存并对其进行初始化。(3)定义了变量一定声明了该变量,但声明了变量不一定定义了该变量。在编程中,定义变量和声明变量是两个。

2024-07-09 22:58:45 531

原创 面向对象的程序设计设计思想(解决问题所需要的类),面向过程的程序设计思想(解决问题的步骤)

2、当需求复杂时,需要很多的功能,此时会发现面对每一个步骤已经变得非常麻烦了,这是就可以思考,能否将这些功能进行封装,根据功能的不同,将功能类似的功能封装在一起,形成一个类,使用时,只要找到对应的类即可。面向对象思想是现代编程语言的主流编程思想,除了C语言外,其他的主流编程语言,无论是脚本的还是非脚本的,基本上都引入了面向对象这一设计思想,3、早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高,面向过程的弊端越来越明显,之后便出现了面向对象思想并成为主流的程序设计思想。面向对象设计思想是怎样的?

2024-07-09 14:38:44 1261

原创 触发器编程-创建(CREATE TRIGGER)、删除(DROP TRIGGER)

2、一个触发器只适用于一个表,每个表最多只能有3个触发器,分别是INSERT触发器、UPDATE触发器和DELETE触发器。(3)INSTEAD OF:当对触发器作用的表执行INSTEAD OF后面指定的操作时,仅执行触发器程序。2、对S表创建一个级联删除的触发器,要求删除s表中记录时要把SC表中相应的选课记录也删除。当对定义了触发器的关系表中做数据更新操作时,系统会自动执行相应的触发器,不需要人为执行。由于INSERT或UPDATE语句的执行而导致要加到该触发器作用的表中去的所有新行。

2024-07-08 02:06:10 1350

原创 存储过程编程-创建(CREATE PROCEDURE)、执行(EXEC)、删除(DROP PROCEDURE)

【=默认值】【OUTPUT】【,...n】【WITH RECOMPILE|ENCRYPTION 】【EXEC【UTE】】 过程名 【@=】【,@=】2、存储过程分为三类:系统提供的存储过程、用户定义的存储过程和扩展存储过程。(1)系统提供的存储过程:在安装SQL Server时,系统创建了很多。(3)扩展存储过程:是对动态链接库(DLL)函数的调用。DROP PROCEDURE (2)自定义的存储过程:是由用户。

2024-07-08 01:08:30 401

原创 事务处理机制保证事务ACID特性、日志实现数据库备份、DBMS用日志撤销事务或重做事务、数据库备份恢复数据库一致性、并发控制保证并发事务隔离性、封锁粒度和事务隔离级别提高并发事务执行效率、减少死锁发生

使得当数据库系统发生各类故障后,DBMS能利用这些日志来撤销UNDO未完成的事务或重做REDO已完成的事务,保证事务的原子性和持久性。虽然不同的DBMS实现的事务处理机制提供给用户的接口和操作语言略有不同,但它们实现的目标和功能是一致的 ,学习的内容是可以触类旁通的。在实际的应用中,对于需要一组SQL语句作为一个整体来同步完成的复杂的数据操作,我们就需要利用SQL语言提供的事务定义语句来。,当然这需要我们容忍某种不影响应用的数据不一致问题的存在,否则我们只能牺牲效能来得到可串行化的结果。

2024-07-07 22:17:38 258

原创 隔离级别-隔离级别中的锁协议、隔离级别类型、隔离级别的设置、隔离级别应用

(1)在查询窗口1开始执行事务T1前,设置隔离级别为REPEATABLE READ可重复读,然后开始执行事务T1,首先对SC表中学号SNO='2022018014030'的元组进行查询,留意查询结果。(3)但该事务的读锁是短期锁,读操作完成后就释放了读锁,若有另一个事务随后对该事务所读的数据进行了更新并提交,则该事务对同一数据对象进行的再次读取的结果与前一次是不一样的,(3)接着在修改学号SNO='202218014030'的学生的成绩,操作不能执行,说明事务T1的读锁是加在元组上的且读完并没有释放锁。

2024-07-07 21:00:50 1333

原创 多粒度封锁-封锁粒度、多粒度封锁模式

(4)返回事务T1继续运行事务,使用NOLOCK锁SC中SNO='202218014030'的元组,查询可执行,事务T1可读到事务T2修改后的数据,看到SC表中SNO='202218014030'的元组的GRADE值被更新,而事务T2没有提交,(8)然后回滚事务T2,对事务T2中修改的元组进行查询,可见对SC表中SNO='202218014030'的元组的修改被撤销了,而已提交的事务T1已读取了事务T2中间修改过的值,读取了脏数据。

2024-07-07 11:38:19 1101

原创 死锁-活锁与活锁的预防、死锁与死锁的预防和检测(处理死锁的方式:事务等待图)

当事务T1想对X写入新值时,则需将读锁升级为写锁,但其申请的数据对象X上的写锁与事务T2当前所持有的读锁不相容,事务T1申请的写锁得不到满足,事务T1需要等待,当事务T2想对数据对象X写入新值时,也需将读锁升级为写锁,但其申请的数据对象X上的写锁,也与事务T1当前所持有的读锁不相容,事务T2也不能获得数据对象X上的写锁,事务T2也需要等待,当事务T1要写数据对象B时,因事务T3已获得数据对象B上的读锁,则事务T1也只能等事务T3释放锁,则在事务等待图中,会产生结点T1到结点T3的一条边。

2024-07-06 15:10:53 843

原创 封锁-封锁模式(共享锁、排他锁)、封锁协议(两阶段封锁协议)

若采用严格的两阶段封锁协议,事务T1在读取数据库对象X之前,申请并获得读锁,写数据库对象之前升级读锁为写锁,写后并没有释放锁,然后事务T2对数据库对象X申请的读锁,与事务T1已持有的数据库对象X上的写锁不相容,封锁请求得不到满足,事务T2处于等待状态,事务T1继续完成对数据库对象Y的读写,事务执行完成,提交后才释放数据库对象X和Y上的锁,事务T2才能够开始执行,当一个事务对需要访问的数据库对象,例如关系、元组等进行操作之前,要先向系统发出封锁请求,获得所访问的数据库对象上的锁,即。

2024-07-06 09:52:16 1839

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除