96SEO 2026-02-20 06:08 0
。

那么如何保证数据并发访问的一致性、有效性是数据库必须解决的一个问题#xff0c;锁的冲突也是影响数据库并发访问性能的一个重要因素#xff0c;所以数据库中锁的应用极为重要#xff0c;其复杂度也更…一、锁的介绍
锁是计算机协调多个进程或者线程并发访问某一资源的机制。
那么如何保证数据并发访问的一致性、有效性是数据库必须解决的一个问题锁的冲突也是影响数据库并发访问性能的一个重要因素所以数据库中锁的应用极为重要其复杂度也更高。
对整个数据库实例加锁加锁后整个实例就处于只读状态对于后面的DML语句DDL语句已经更新操作的事务提交语句都会被阻塞。
典型的场景应用数据备份。
对所有的表进行锁定从而获取数据的一致性保证数据的完整性。
如图所示我们加了全局锁之后使用mysqldump取备份数据的时候其他客户端的事务是不能执行DML操作、DDL操作的但可以执行DQL操作当我们备份好数据后导出xxx.sql文件后再解开锁此时DML操作、DDL操作才生效。
其中DML操作是指对数据进行增加、删除、修改操作。
DDL操作是指主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。
DQL操作是指对数据进行查询操作。
还有DCL操作是指主要是用来设置/更改数据库用户权限。
①如果在主库上备份那么备份期间都不能执行更新业务基本上就停摆了
②如果在从库上备份那么在备份期间不能执行同步过来的二进制日志洗会导致延迟。
最高并发度低。
应用在MyISAM、InnoDB、BDB等存储引擎中。
如图所示有两个客户端Client1、Client2当Client1执行加锁操作后Client1、Client2都只能执行DQL操作不能执行DDL/DML操作进行堵塞。
只有当Client1解锁后才能恢复DDL/DML的操作。
如图所示有两个客户端Client1、Client2当Client1执行加锁操作后Client1对该表能读能写Client2不能执行DQL操作和不能执行DDL/DML操作进行堵塞。
只有当Client1解锁后才能恢复Client2的DQL/DDL/DML的操作。
元数据锁加锁过程是系统自动控制的无需显示使用主要作用是为了维护表元数据的一致性。
MDL的读锁分为类型分为shared_read(执行select、select
触发)、shared_write(执行insert、update、delete、select...for
如图所示两个客户端Client1、Client2当这两个客户端执行CRUD操作的时候系统就自动添加了MDL的读锁而读锁之间是不排斥的所以Client1与Client2对User表的操作不会造成堵塞。
如图所示两个客户端Client1、Client2,假设Client1执行了DQL操作那么此时系统产生了MDL读锁如果这时我们的Client2执行DDL操作就会被堵塞因为DDL操作产生的是MDL的写锁会与MDL的写锁排斥。
此时只有Client1commit提交后Client2的语句才会生效。
为了避免DML在执行时加的行锁与表锁的冲突在InnoDB中引入了意向锁使得表锁不用检查
如图所示当我们Client1执行一个update语句的时候我们的mysql
若此时没有意向锁且Client2想对整张表进行锁表操作那么Client2就会从第一条记录开始一条条查找对应行有没有行锁找到行锁后在判断该行锁类型与添加的表锁是否冲突再决定是否加锁现实这个过程效率很低。
假如我们加了意向锁如图所示此时Client1执行上诉同样的操作而Client2在执行使先
与表锁是否兼容若兼容直接加锁若不兼容则Client2的操作会阻塞直到Client1进行了commit操作且释放意向锁和行锁后才生效。
此时不用逐行检查行锁的情况效率增加。
意向锁分为两类意向共享锁IS和意向排他锁IX两类接下来做以下介绍。
意向共享锁与表锁的表共享读锁read兼容与表独占写锁(write)排斥。
mode触发意向共享锁IS,此时Client2执行锁表的read
意向排他锁与表共享读锁(write)、表独占写锁(read)都互斥。
意向锁之间不会互斥。
触发意向排它锁IX,此时Client2执行表共享读锁(write)、表独占写锁(read)都会被互斥因为不兼容只有等Client1执行完毕提交后Client2的指令才会触发。
中锁定粒度最小的一种锁是针对索引字段加的锁只针对当前操作的行记录进行加锁。
行级锁能大大减少数据库操作的冲突。
其加锁粒度最小并发度高但加锁的开销也最大加锁慢会出现死锁。
应用在Innodb储存引擎中。
只允许一个事务去读一行阻止其他事务获得相同的数据集的排它锁。
共享锁之间兼容与排它锁之间排斥
允许获取排它锁的事务更新数据阻止其他事务获得相同数据集的共享锁和排他锁排它锁与排它锁、共享锁之间都冲突阻止其他事务的读锁和写锁
id5操作此时因为表中没有id5的字段此时就会在id7和id3之间加一个间隙锁不包含id3和id7的情况此时Client2又执行了一个insert
values(6,李蛋,6)指令在id3和id7之间插入一条指令因为加了间隙锁所以插入操作会被阻塞直到Client1完成commit提交后Client2插入语句才会生效。
临键锁是记录锁与间隙锁的组合它的封锁范围既包含索引记录又包含索引区间。
默认情况下InnoDB在Repeatable
Read事务隔离级别运行InnoDB使用临键锁进行搜索和索引扫
描以防止幻读。
临键锁与间隙锁相比除了锁住当前记录也会锁定当前记录之前的一部分间隙
乐观锁是一种在数据库操作中用于处理并发问题的技术。
它的思想是认为数据一般情况下不会造成冲突所以在数据进行提交更新的时候才会正式对数据的冲突与否进行检测如果发现冲突了则让返
利用数据版本号version机制是乐观锁最常用的一种实现方式。
一般通过为数据库表增加一个数字类型的
数据每更新一次对此version值1。
当我们提交更新的时候判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对如果数据库表当前版本号与第
一次取出来的version值相等则予以更新否则认为是过期数据返回更新失败。
②处理开销在处理冲突时需要执行回滚和重试这可能会增加系统的开销。
③版本管理乐观锁通常通过版本号或时间戳来检测冲突。
这要求系统能正确的控制版本号否则可能导致错误的版本冲突。
悲观锁是指数据在操作数据的时候比较悲观每次去拿数据的时候认为别的线程也会同时修改数据所以在每次拿数据的时候都会加锁这样别的线程想要拿数据就会被阻塞直到它解开锁。
②Java中使用synchronized和ReentrantLock等独占锁方式实现。
①写操作比较多的场景。
②并发冲突高的场景。
③业务需要强一致性的的场景。
③锁超时如果一个事务长时间有锁而不被释放可能导致其他等待锁的事务超时。
一些特点。
相信一定对屏幕前正在阅读的小伙伴有所帮助大家不要忘记点赞、关注支持博主一波哦后续还有更多内容与大家分享~
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback