自学内容网 自学内容网

MySQL3.0

13.事务的隔离级别

事务隔离级别主要用于控制多个并发事务之间的相互影响程度。

  1. 读未提交:这是最低的隔离级别。这个级别下,一个事务可以读取到另一个事务未提交的数据。例如:事务a对某数据进行修改但是尚未提交,事务b此时就可以读取到事务a修改后的数据。会导致脏读问题。
  2. 读已提交:一个事务只能读取另一个事务已经提交的数据。但是会出现不可重复读的问题。
  3. 可重复读:这是MySQL默认的隔离级别。在一个事务内,多次读取同一数据,其结果是相同的,不受其他事务对该数据修改的影响。但是会出现幻读问题。
  4. 串行化:这是最高的隔离级别。在这个级别下,事务是串行执行的,一个事务执行完后,另一个事务才能开始执行。虽然可以解决所有并发问题,但会影响系统的并发性能。

14.MySQL的锁

锁是数据库管理系统用于控制多个并发事务对数据库对象访问的一种机制。确保数据的一致性和完整性,防止多个事务对同一数据进行冲突操作。

按照锁的粒度划分

  • 表锁:表锁是对整个表进行加锁。当一个事务对表加了表锁后,其他事务对该表的读写操作都会收到限制。实现简单,开销较小,但是并发性能差。
  • 行锁:行锁是对表中的一行数据进行加锁。它可以更加精确的控制并发访问,只锁住需要操作的行,提高了并发性能。InnoDB存储引擎使用的就是基于索引的行锁。

按照锁的类型划分

  • 共享锁:共享锁也叫读锁。多个事务可以同时对同一数据对象加共享锁,用于读取数据。当一个事务对数据对象加了共享锁后,其他事务也可以对该对象加共享锁进行读取。
  • 排他锁:排他锁也叫写锁。当一个事务对数据对象加了排他锁后,其他事务不能对该对象加任何锁,直到该事务释放排他锁。排他锁用于对数据进行修改操作,以确保数据的完整性。
  • 意向锁:意向锁是InnoDB存储引擎特有的一种锁。它主要用于在事务对表中的行加锁时,表示事务的意向。有两种意向锁:意向共享锁,意向排他锁。

当事务对表中的行加共享锁时,会先对表加意向共享锁;排他锁同理。意向锁的作用是在更高表层次上表示事务对表中部分行的加锁意图,这样进行表锁操作时,可以更快判断表内是否有行锁冲突。例如,在一个包含多个部门员工信息的表中,事务a对某个部分的部分员工加行锁,通过意向锁,其他事务在尝试对整个表加锁时可以快速知道表内有行锁存在,避免了对表内每行锁进行检查的复杂操作~

15.什么是视图?

视图是从一个或多个表中导出的虚拟表。它本身不包含实际的数据,而是基于查询定义来动态地从底层的表中获取数据。简单来说,视图就是一个窗口,通过整个窗口可以看到数据库中表的数据,但这个窗口所展示的数据是经过筛选等操作后的结果。

视图的优点

  1. 简化复杂查询:对于复杂的多表连接和条件筛选操作,通过视图可以将这些复杂的操作封装起来。用户只需要查询视图,而不需要每次都编写复杂的查询语句。
  2. 增强数据安全性:可以通过视图来限制用户对底层表数据的访问。只让用户看到视图中展示的数据,而隐藏底层表中敏感信息或不必要的数据。
  3. 提供逻辑的独立性:如果数据库的表结果发生了变化,比如添加或者删除列等,只要视图的定义仍然能够基于新的表结构获取合理的数据,那么对使用视图的用户来说,是没什么影响的。

16.什么是游标?

游标是数据库系统中用于处理查询结果集的一种机制。他就像一个指针,允许用户逐行的访问或处理从数据库中检索出来的结果集。在sql中,当执行一个查询语句,数据库就会返回一个结果集。如果没有游标,我们只能一次性处理整个结果集,而游标提供了一种细粒度的控制方式,让我们能够对结果集中的每一行进行单独操作。

游标的工作原理

当打开一个游标时,它会与一个查询语句相关联,并执行这个查询,将结果集存储在一个临时的工作区域中。游标有一个当前位置,初始时指向结果集的第一行。可以通过游标提供的操作(如 FETCH 语句)来移动这个当前位置,从而获取不同行的数据。

使用场景

  • 复杂的逐行处理
    • 当需要对查询结果集中的每一行数据进行复杂的、与其他业务逻辑相关的操作时,游标就非常有用。比如,在一个财务数据库中,要对一个包含大量交易记录的结果集进行逐行审核。对于每一笔交易,需要检查交易金额是否超过一定的阈值,若超过则进行特殊标记或者触发其他业务流程,如发送通知给相关人员。使用游标可以方便地实现这种逐行的检查和处理。
  • 多结果集关联处理
    • 有时需要从多个不同的查询结果集中获取数据,并将它们关联起来进行处理。游标可以在这种情况下发挥作用。例如,在一个学校的数据库中,有学生成绩表和课程表。首先通过一个游标获取成绩表中成绩不及格的学生名单,然后对于每个不及格的学生,使用另一个游标在课程表中查找该学生所修的课程信息,以便进一步分析是哪些课程导致了不及格的情况。
  • 动态构建结果集
    • 可以利用游标来动态地构建一个新的结果集。例如,在一个库存管理数据库中,要对库存商品进行盘点。通过游标逐行读取库存商品记录,根据一定的规则(如商品的类别、保质期等)筛选出需要重点关注的商品记录,将这些筛选出来的记录添加到一个新的临时结果集中,最后对这个新的结果集进行汇总分析,如统计重点关注商品的总价值等。

17.什么是存储过程?

存储过程是一组为了完成特定功能的SQL语句集。它经过编译后存储在数据库中,存储过程就像是数据库中的一个小型程序,它可以接收输入参数,执行一系列的数据库操作,并且可以返回输出参数或者结果集。

存储过程的优点

  • 提高性能:存储过程在第一次执行时会被编译并存储在数据库的缓存中。之后再次执行相同的存储过程时,数据库可以直接从缓存中调用已经编译好的版本,避免了重复编译sql语句的开销。比如:在一个频繁进行用户登录验证的系统中,将验证用户身份的 SQL 语句封装成存储过程,每次用户登录时调用这个存储过程,由于它已经编译过,所以可以快速执行,提高了验证的效率。
  • 增强安全性:通过存储过程,可以限制用户对数据库表的直接访问。用户只需要执行存储过程来完成特定的操作,而不需要拥有对底层表的所有操作权限。例如,在一个银行数据库中,普通柜员可以通过执行存储过程来办理存款、取款等业务,而不需要有直接修改账户余额表的权限。这样可以防止柜员误操作或者恶意篡改数据,保证了数据的安全性。
  • 可重复使用和维护方便:存储过程封装了一系列的 SQL 语句,形成了一个独立的功能模块。在不同的应用程序或者业务场景中,如果需要执行相同的数据库操作,可以重复调用存储过程。而且,当业务逻辑发生变化需要修改数据库操作时,只需要修改存储过程中的 SQL 语句即可,而不需要在多个应用程序代码中寻找和修改相关的 SQL 调用语句。例如,在一个电商系统中,计算商品总价的业务逻辑(包括查询商品价格、计算折扣等)封装在一个存储过程中,无论在购物车结算还是订单生成的场景中,都可以调用这个存储过程来计算总价,并且如果折扣规则发生变化,只需要修改存储过程内部的 SQL 语句就可以了。

18.什么是触发器?

触发器是一种特殊的存储过程,它与表紧密相关,会在特定的数据库事件(比如插入,更新等操作)发生时自动执行。可以看作是一个数据库的监听器,当它所监视的表上发生了预先定义好的事件时,就会触发相应操作。

触发器的类型

  • 按触发事件类型划分
    • INSERT 触发器
      • 这种触发器在向表中插入数据时被触发。例如,在一个学生信息管理系统中,有一个学生表(students),当向这个表中插入一条新的学生记录时,INSERT 触发器可以自动将插入时间记录到另一个日志表(student_insert_log)中。
    • UPDATE 触发器
      • 当对表中的数据进行更新操作时触发。假设在一个电商产品表(products)中,产品价格被更新时,UPDATE 触发器可以检查新价格是否在合理的价格区间内。如果价格超出范围,就可以取消这次更新操作或者记录下异常情况到专门的监控表中。
    • DELETE 触发器
      • 当从表中删除数据时触发。比如在一个订单管理系统中,当删除一个订单记录时,DELETE 触发器可以先将该订单相关的附属信息(如订单详情、支付记录等)进行清理或者备份,然后再执行删除订单的操作。
  • 按触发时间划分
    • BEFORE 触发器
      • 这种触发器在触发事件(插入、更新、删除)发生之前执行。它可以用于对即将插入、更新或删除的数据进行检查和预处理。例如,在一个员工工资表(salaries)中,BEFORE UPDATE 触发器可以在更新工资之前检查新工资是否符合公司的工资政策,如不能低于最低工资标准。如果不符合,可以修改新工资的值或者直接阻止这次更新。
    • AFTER 触发器
      • AFTER 触发器在触发事件发生之后执行。它主要用于对已经完成的操作进行后续处理。例如,在一个库存管理系统中,当商品销售记录(sales)更新(销售了商品,库存数量相应减少)后,AFTER 触发器可以检查库存数量是否低于安全库存水平。如果低于,就触发补货流程或者通知相关人员。

19.SQL语句分为哪几类?

  1. 数据定义语言(DDL):用于定义数据结构,包括创建,修改,删除数据库对象,如数据库表,视图,索引等。
  2. 数据操作语言(DML):用于对数据库中的数据进行操作,比如插入,更新,删除数据。
  3. 数据控制语言(DCL):用于控制数据库用户的权限,包括授予和收回用户对数据库对象的访问权限。(比如grant,revoke)
  4. 事务控制语言(TCL):用于管理数据库事务,确保数据库操作的一致性和完整性。(比如begin transaction用于开启一个事务;commit用于提交一个事务;rollback用于回滚一个事务)
  5. 数据查询语言(DQL):用于对数据库进行查询。

如果本篇博客对大家有帮助的话,希望大家可以关注一下,也可以点开主页看看其他博客~


原文地址:https://blog.csdn.net/m0_74166099/article/details/144355001

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!