触发器
介绍:
触发器是与表有关的数据库对象,指在insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名old和new 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。
现在触发器还支持行级触发,不支持语句级触发
|------------|-------------------------------|
| 触发器类型 | new 和old |
| insert型触发器 | new 表示将要或者已经新增的数据 |
| update型触发器 | old表示修改之前的数据,new表示将要或已经修改后的数据 |
| delete型触发器 | old表示将要或者已经删除的数据 |
语法:
创建
create trigger trigger_name before/after insert/update/delete on tbl_name for each row --行级触发器 begin trigger_stmt; end;
查看
show triggers;
删除
drop trigger [schema_name .] trigger_name;
MySQL中的锁,按照锁的粒度分,分为一下三类:
-
全局锁: 锁定数据库中的所有表
-
表级锁:每次操作锁住整张表
-
行级锁:每次操作锁住对应的行数据
全局锁:
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞
flush tables with read lock; 对数据库上锁
mysqldump -uroot -p1234 itcast>itcast.sql >号是备份到的意思,将数据库备份
unlock tables ; 解锁
特点:
数据库中加全局锁,是一个比较重的操作,存在一下问题:
-
如果从主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆
-
如果从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。
在InnoDB引擎中,我们可以在备份时加上参数 --single-transaction参数来完成不加锁的一致性数据备份
mysqldump --single-transaction -u root -p1234 itcast>itcast.sql
表级锁
表级锁,每次操作锁住整张表。锁定粒度大,发生所冲突的概率极高,并发度最低
表级锁分为3类:
1.表锁
-
元数据锁
-
意向锁
对于表锁,分为两类:
1.表共享读锁(read lock)
- 表独占写锁(write lock)
语法:
-
加锁: lock tables 表名 read /write
-
释放锁: unlock tables/客户端断开连接。

读锁只能读不能写,并且不会阻塞其他客户端的读
写锁:
读锁自己不仅能读还能写,而其他客户端,什么也做不了;

意向锁:
当我们开启一个事务,并且执行update语句是,就会对更新那一行产生行锁,那么我们在此对着表进行表锁时,这个表就会把每一行进行检查,看有没有行锁,避免所冲突,那样就性能大大降低。

-
意向共享锁: 又语句 select ... lock in share mode 添加
-
意向排他锁: 由insert,update,delete ,select... for update 添加

行级锁:
行级锁,每次操作锁住对应的行级锁。锁定粒度最小,发生锁冲突的概率最低,并发度最高。用于InnoDB存储引擎中
主要分为3类:
1: 行锁:锁定单个行记录的锁,防止其他事务对此进行update 和delete.

2.间隙锁: 锁定索引记录间隙,确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读
- 临键锁: 行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap,在RR隔离级别下支持

