yanchang
yanchang
发布于 2025-03-18 / 6 阅读
0
0

复试准备3.18(数据库)

🔍 那事务到底是什么?

一句大白话总结:

事务就是数据库里一组“打包”执行的操作,要么全都成功,要么全都失败,不能中间掉链子。

就像你去银行转账,操作流程可能包括:

  1. 从你账户扣钱

  2. 给对方账户加钱

这两个操作必须绑定在一起:不能只扣了你的钱,结果转给对方失败了,这不血亏?

这时候就需要事务机制来保证:

  • 两步要么都成功;

  • 要么一旦哪一步出错,全部回滚,就像啥都没发生过。


🔑 事务的4大特性(ACID)

这四个字母,你迟早会遇见:

特性

含义

举例解释

A - 原子性(Atomicity)

一组操作,要么全部完成,要么全部不做

就像包裹快递,一起寄出;不能只寄个包装袋

C - 一致性(Consistency)

数据操作前后符合规则/约束

钱没丢没多出来,余额还是对的

I - 隔离性(Isolation)

多个事务互不干扰

你存钱的时候,别人查余额不会查到一半

D - 持久性(Durability)

提交后数据永久保存

只要提交了,断电也不怕,数据落地


💡 一个小例子感受一下

START TRANSACTION; 
UPDATE account SET balance = balance - 100 WHERE name = '张三'; 
UPDATE account SET balance = balance + 100 WHERE name = '李四'; 
COMMIT;

复制编辑

这就是一个事务:

  • START TRANSACTION; 开始事务;

  • 中间两条是要打包执行的操作;

  • COMMIT; 表示“OK,我确认没问题了,正式提交”。

如果中间某条 SQL 报错了?
你可以用 ROLLBACK; 回滚,就像撤销操作一样。


✅ 总结一句话

事务就是数据库的“保险机制”,帮你把多个相关操作绑成“一揽子”,要成一起成,要挂一起挂,保证数据完整靠谱。

✅ 什么是断言(Assertion)?

断言,就是数据库中用来设定更通用、更复杂的一种约束条件

通俗点说:“断言”就像数据库里的“规矩条款”,只要谁敢违反,就直接不让你动数据。

它比表级别的那些“主键/外键/检查约束”还要再高级一点,因为它可以对多个表、多条规则一起检查,不是只能盯死某一个字段。


📌 举个例子,马上就懂了:

假设你有两个表:

  • 部门(department):部门信息

  • 员工(employee):员工信息,每个员工有个工资字段 salary

现在公司有个规则:

所有员工的平均工资不得超过 20000元

这个时候,普通的字段约束、主键、外键都搞不定这事儿对吧? 你就可以用断言来设置这个规则:

sql

复制编辑

CREATE ASSERTION salary_limit CHECK ( (SELECT AVG(salary) FROM employee) <= 20000 );

意思就是:

“兄弟,以后谁要往 employee 表插入/更新工资字段,只要让平均工资超过2万,我就直接拒绝,别想动数据库!”


🧠 和其他约束的区别?

类型

作用范围

能做的限制

主键 / 外键

单个字段或表之间

标识唯一性 / 保证关联

CHECK 约束

单个字段

限制单字段的值范围

断言(ASSERTION)

跨表 / 全局

限制更复杂的逻辑条件

可以理解为:

  • CHECK 是小门卫:站在表门口,专看某个字段;

  • ASSERTION 是大保安队长:全场巡视,只要哪里不符合规矩就拦你。


❗不过现实情况是:

很多主流数据库(比如 MySQL)其实并不支持 ASSERTION 语句。 原因是性能开销大,不好维护。
开发者通常用:

  • 触发器(Trigger)

  • 存储过程(Procedure)

  • 应用层逻辑判断 来代替实现类似效果。

所以你在考试题里写断言是没问题的,概念必须懂,但在实际工作中很多时候你会“用别的方式绕着实现”。


✅ 总结一句话:

断言是数据库的“全场通用规则”,谁违反了,数据库就直接掀桌子不给你操作。

触发器是什么

  1. 数据完整性控制

    • 触发器可以在数据变动前(BEFORE)或变动后(AFTER)检查和处理数据,确保数据符合业务规则。例如,在更新或删除数据时,可以自动检查是否违反了某些复杂的完整性约束。

  2. 自动化业务处理

    • 触发器能够自动执行一些复杂操作,如日志记录、级联更新或删除、数据备份等,减少在应用层编写冗长的逻辑代码。

  3. 增强数据库安全性

    • 通过在数据操作时自动检查条件,触发器可以防止不符合条件的数据写入数据库,从而增强了数据安全性和稳定性。

  4. 灵活性

    • 相比于传统的约束(如主键、外键或 CHECK 约束),触发器的逻辑更为灵活,可以跨多个表进行数据验证和处理,适用于更复杂的业务场景。


触发器的基本特点

  • 事件驱动:触发器在指定表的增、删、改操作发生时自动激活。

  • 定义位置:触发器是定义在具体表上的,当该表数据发生操作时,触发器会自动执行预定义的 SQL 代码。

  • 执行时机:触发器可设置为在操作前(BEFORE)或操作后(AFTER)执行。

  • 自动回滚:如果触发器中执行的检查或操作不满足要求,可以通过回滚操作撤销当前事务,保证数据一致性。


示例说明

假设有一张订单表,当用户插入一条订单记录后,需要自动更新库存表中对应商品的库存数量。你可以这样定义一个触发器:

CREATE TRIGGER update_stock_after_insert 
AFTER INSERT ON orders 
FOR EACH ROW 
BEGIN 
  UPDATE products 
  SET stock = stock - NEW.quantity 
  WHERE product_id = NEW.product_id; 
END;

复制编辑

这段代码的含义是:每当向 orders 表插入新记录后,数据库会自动减少 products 表中对应 product_id 的库存数量。这样就可以保证订单操作和库存更新在同一事务中一致执行,避免数据不一致的情况出现。


总结

触发器在数据库中扮演着自动守护者的角色,能在数据操作的同时自动检查和处理相关逻辑,使得数据管理更为严谨和自动化。它们虽然类似于约束,但提供了更高的灵活性和功能扩展性,是维护数据库完整性和执行自动化业务流程的重要工具


评论