MySQL基础--触发器,锁

触发器

        触发器是与表有关的数据库对象,指在 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,本篇文章就到此结束了,非常感谢你能看到这里,所以如果你觉得这篇文章对你有帮助的话,请点一个大大的赞,支持一下博主,若你觉得有什么问题或疑问,欢迎私信博主或在评论区指出~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值