🔍 那事务到底是什么?
一句大白话总结:
事务就是数据库里一组“打包”执行的操作,要么全都成功,要么全都失败,不能中间掉链子。
就像你去银行转账,操作流程可能包括:
从你账户扣钱
给对方账户加钱
这两个操作必须绑定在一起:不能只扣了你的钱,结果转给对方失败了,这不血亏?
这时候就需要事务机制来保证:
两步要么都成功;
要么一旦哪一步出错,全部回滚,就像啥都没发生过。
🔑 事务的4大特性(ACID)
这四个字母,你迟早会遇见:
💡 一个小例子感受一下
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 是大保安队长:全场巡视,只要哪里不符合规矩就拦你。
❗不过现实情况是:
很多主流数据库(比如 MySQL)其实并不支持 ASSERTION 语句。 原因是性能开销大,不好维护。
开发者通常用:
触发器(Trigger)
存储过程(Procedure)
应用层逻辑判断 来代替实现类似效果。
所以你在考试题里写断言是没问题的,概念必须懂,但在实际工作中很多时候你会“用别的方式绕着实现”。
✅ 总结一句话:
断言是数据库的“全场通用规则”,谁违反了,数据库就直接掀桌子不给你操作。
触发器是什么
数据完整性控制
触发器可以在数据变动前(BEFORE)或变动后(AFTER)检查和处理数据,确保数据符合业务规则。例如,在更新或删除数据时,可以自动检查是否违反了某些复杂的完整性约束。
自动化业务处理
触发器能够自动执行一些复杂操作,如日志记录、级联更新或删除、数据备份等,减少在应用层编写冗长的逻辑代码。
增强数据库安全性
通过在数据操作时自动检查条件,触发器可以防止不符合条件的数据写入数据库,从而增强了数据安全性和稳定性。
灵活性
相比于传统的约束(如主键、外键或 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 的库存数量。这样就可以保证订单操作和库存更新在同一事务中一致执行,避免数据不一致的情况出现。
总结
触发器在数据库中扮演着自动守护者的角色,能在数据操作的同时自动检查和处理相关逻辑,使得数据管理更为严谨和自动化。它们虽然类似于约束,但提供了更高的灵活性和功能扩展性,是维护数据库完整性和执行自动化业务流程的重要工具