mysql锁怎么优化 mysql锁机制

MySQL 原理与优化:原数据锁的应用 MySQL 中原数据锁是系统自动控制添加的 , 对于用户来说无需显示调用,当我们使用一张表的时候就会加上原数据锁 。
原数据锁的作用是为了保护表原数据的一致性,如果在表上有活动事务的时候 , 不可以对元数据进行写入操作 。也就是为了避免DML 和DDL 之间的冲突,保证读写的正确性 。
说白了就是,在对数据表进行读写操作的时候 , 不能进行修改表结构的操作。
如上图所示,在执行select 操作的时候,MySQL 会自动加上shared_read 锁,在insert,update , delete 以及 select for update 操作的时候会加上shared_write 锁,这两类锁是兼容的 。
在执行alter table 操作的时候 , 会加上 exclusive 锁,这个锁与shared_read 和 shared_write 锁 是互斥的,换句话说在 做查询和更新表数据的时候,是不能够修改表结构 的 。
来看个例子
首先开启事务,使用select 语句会针对表加上shared_read的共享锁
begin;
select * from course;
此时查看原数据锁的信息
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
通过上图我们可以发现,course 表加上了shared_read锁 。
接着 , 开启另外一个事务,记住刚才的事务不要commit
begin;
update course set name = 'Jason' where id =2;
如上图所示,此时的update 语句可以执行成功,并没有被阻塞 。说明select 和update 是不冲突的 , 他们的锁是兼容的 。
再次查看原数据锁
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
从上面的截图可以看出,此时原数据锁的表中记录了两条记录分别是针对course 表的shared_read 和 shared_write 锁,也刚好对应我们执行的select 和update 操作 。
最后,我们再启动第三个客户端 , 并且启动 第三个事务,执行alter语句,在course 表中加入一个字段hello 如下。
begin;
alter table course add column hello int;
由于之前的事务没有提交所以修改表的操作会被阻塞,因为shared_read 以及 shared_write 这两个锁 与 exclusive之间是互斥的,所以会阻塞。
此时 , 回到最开始的两个客户端,对两个事务进行commit 操作,再返回到第三个事务执行的alter 语句出,发现语句顺利执行 。
Mysql数据库全局锁是如何引起的,如何解决?锁产生的原因是因为请求某个资源而得不到满足 。
比如请求一需要资源顺序为A - B -C
第二个请求需要的资源顺序为B - A -C
当上面两个请求同时进行时会有可能产生以下情况:请求一申请了资源A,请求二申请了资源B
然后请求一再去申请资源B时需要等待请求二完成,请求二去请求资源A时要等请求一完成 。这样请求一和请求二都在互相等待的时候就会一直都完不成就等于一个锁锁住了A、B资源谁也用不了了 。
锁差生的原因是:数据库并发太高、程序设计不合理、数据库操作处理时间太长 。等
知道原理后可以针对性的优化数据库和程序 。
mysql解决死锁问题官方定义如下:两个事务都持有对方需要的锁 , 并且在等待对方释放,并且双方都不会释放自己的锁 。
这个就好比你有一个人质,对方有一个人质,你们俩去谈判说换人 。你让对面放人,对面让你放人 。
看到这里 , 也许你会有这样的疑问,事务和谈判不一样,为什么事务不能使用完锁之后立马释放呢?居然还要操作完了之后一直持有锁?这就涉及到 MySQL 的并发控制了 。
MySQL的并发控制有两种方式,一个是 MVCC,一个是两阶段锁协议 。那么为什么要并发控制呢?是因为多个用户同时操作 MySQL 的时候,为了提高并发性能并且要求如同多个用户的请求过来之后如同串行执行的一样( 可串行化调度 ) 。具体的并发控制这里不再展开 。咱们继续深入讨论两阶段锁协议 。
官方定义:
对应到 MySQL 上分为两个阶段:
就是说呢,只有遵循两段锁协议,才能实现可串行化调度。
但是两阶段锁协议不要求事务必须一次将所有需要使用的数据加锁,并且在加锁阶段没有顺序要求,所以这种并发控制方式会形成死锁 。
MySQL有两种死锁处理方式:
由于性能原因,一般都是使用死锁检测来进行处理死锁 。
死锁检测的原理是构建一个以事务为顶点、锁为边的有向图 , 判断有向图是否存在环 , 存在即有死锁 。
检测到死锁之后,选择插入更新或者删除的行数最少的事务回滚,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段来判断 。
MySQL如何处理死锁
mysql 死锁:如何解决mysql死锁可直接在mysql命令行执行:show engine innodb status\G;查看造成死锁的sql语句,分析索引情况,然后优化sql然后show processlist;另外可以打开慢查询日志,linux下打开需在my.cnf的[mysqld]里面加上以下内容:
【mysql锁怎么优化 mysql锁机制】关于mysql锁怎么优化和mysql锁机制的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读