您的位置:首页 > 游戏 > 游戏 > MySQL基础--触发器,锁

MySQL基础--触发器,锁

2024/11/15 15:16:51 来源:https://blog.csdn.net/eci__/article/details/141193589  浏览:    关键词: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,本篇文章就到此结束了,非常感谢你能看到这里,所以如果你觉得这篇文章对你有帮助的话,请点一个大大的赞,支持一下博主,若你觉得有什么问题或疑问,欢迎私信博主或在评论区指出~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com