触发器
触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的 SQL 语句集合,触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。
行级触发器:例如执行 update 语句,他影响了五行,这个时候这个触发器出发了五次,就称为行级触发器。
语句级触发器:执行了 update ,不管影响了多少行,支触发一次,就叫语句级触发器。
语法:
锁
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU,RAM,I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
分类:
按照锁的粒度分为:
1.全局锁:锁定数据库中的所有表。
2.表级锁:每次操作锁住整张表。
3.行级锁:每次操作锁住对应的行数据。
全局锁
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的 DML 写语句,DDL 语句,已经更新操作的事务提交语句都将被阻塞。
典型的应用场景:做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
特点:
数据库中加全局锁是一个很重要的操作,存在以下问题:
1.如果在住库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
2.如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟。
在 InnoDB 引擎中,可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致性数据备份。
表级锁
表级锁,每次操作锁住整张表。锁定力度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM,InnoDB,DBD等存储引擎中。
对于表级锁分为以下三类:
1.表锁
2.元数据锁
3.意向锁
表锁
1.表共享读锁(read lock)
2.表独占写锁(write lock)
语法:
1.加锁:lock tables 表名... read / write 。
2.释放锁:unlock tables / 客户端断开连接。
读锁不会阻塞其他客户端的读,但是会阻塞写。
写锁既会阻塞其他客户端的读,也会阻塞其他客户端的写。
元数据锁
加锁过程是系统自动控制,无须显示使用,在访问一张表的时候会自动加上,MDL 锁的主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。(为了避免 DDL 与 DML 冲突,保证读写的正确性)
在 MySQL 5.5 中引入了MDL,当对一张表进行增删改查的时候,加 MDL 读锁(共享);当对表结构进行变更操作的时候,加入 MDL 写锁(排他)
意向锁
1.意向共享锁(IS):由语句 select...lock in share mode 添加。与表锁共享锁(read)兼容,与表锁排它锁(write)互斥。
2.意向排它锁(IX):由 update,delete,insert,select...for update添加。与表锁共享锁(read)和表锁排它锁(write)都互斥,意向锁之间不会互斥。
行级锁
InnoDB 中实现了以下两种类型的行锁:
1.共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
2.排它锁(X):允许获取排它锁的事务更新数据,阻止其他事物获得相同数据集的共享锁和排他锁。
Ending:
OK,本篇文章就到此结束了,非常感谢你能看到这里,所以如果你觉得这篇文章对你有帮助的话,请点一个大大的赞,支持一下博主,若你觉得有什么问题或疑问,欢迎私信博主或在评论区指出~