mysql数据库锁机制以及主从复制

mysql锁的分类:
对于数据操作类型来分的话 分为读锁和写锁;
对于数据操作的粒度来说分为表锁和行锁;
表锁来说:偏向于MyISAM存储引擎,开销小,加锁快;无死锁,锁的粒度大,发生锁冲突的概率最高,并发度最低;

show open tables;查看表的信息

加锁 加读锁之后只能对表进行读取操作,不能对表做写操作;

表锁

加锁的命令:
加读锁:lock table mylock read;
注意:
在多个窗口对同一个表进行操作的时候;会产生阻塞情况,直到获取锁进行操作为止,
同一个窗口 如果对某个表上锁,那么该窗口就不能在操作其它的表了;
加写锁:
lock table mylock write;
注意:
同一窗口,自己可以对表进行查询和写操作;
不同窗口 在对表进行读取和写的操作会产生阻塞情况 直到释放锁为止;

解锁
解锁的命令: unlock table mylock;

行锁

偏向于innodb存储引擎,开销大,加锁慢,会出现死锁,锁的粒度最小,发生锁冲突的概率最低,并发度最高
innodb和myisam的最大区别就是 1,支持事务 2. 支持行级锁
事务的acid特性,
原子性 :事务是一个操作单元,其对数据的修改,要么全部执行,要么全都不执行
持久性 :事务完成之后,其对数据的操作是永久性的
隔离性 :数据库提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行,着以为着事务处理过程中的中间状态对外部是不可见的
一致性:在事务的开始和完成时,数据都必须保持一致状态,这以为着所有相关的操作,都必须应用于事务的修改,以保持数据的完整性。

并发带来的数据冲突问题

先介绍几个概念:
事务的隔离级别以及安全级别:
读未提交 < 读已提交 < 可重复读 < 序列化读

脏读:已修改但尚未提交,事务a读取到了事务b已经修改但是还没有提交的数据
不可重复读:再读取已经读过的数据时,发生数据已经发生了变化;
幻读:事务a读取到了事务b新增的数据,前提是两个事务是同时发生的。不符合事务的隔离性;

查看当前数据库的事务隔离级别:
show variables like “tx_isolation”;

关于mysql是如何实现行级锁的
mysql通过mvcc多版本控制协议实现行级锁
深入理解mysql四种隔离级别及底层实现原理(MVCC和锁)

索引失效后行锁变表锁;mysql默认是根据索引来进行上锁的。行锁是建立在索引上的锁,索引失效之后会变成表锁

什么是间隙锁?

当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,innodb会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但是并不存在的记录,叫做间隙

innodb 也会对这个间隙加锁,这种锁机制就是所谓的间隙锁

危害:因为query在执行过程中通过范围查找,他会锁定整个范围内所有的索引键值,即使这个键值并不存在。
间隙锁有一个比较致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成锁定的时候无法插入锁定范围内的任何数据。
比如我们的数据库中有id范围1-6的数据 但是没有id=5的值 我们在另一个窗口添加id=5的值时会发生阻塞情况;
在这里插入图片描述

如何锁定一行

语句后面加上先查询某一行并在后面加上for update; 这样就给这行加上了锁;
在之后的操作中,这一行的操作只有我们自己能操作该行的数据,其它的需要阻塞等待;

主从复制

复制的基本原理:

  1. slave 会从master读取binlog来进行数据同步,这些记录过程叫做二进制日志事件;
  2. slave 将master的binary log events拷贝到它的中继日志中;
  3. slave重做中继日志中的事件,将改变应用到自己的数据库中,mysql的复制是异步的且串行化的 在这里插入图片描述
    复制的基本规则
  4. 每个slave只有一个master
  5. 每个master只能有一个唯一的服务器ID
  6. 每个master可以有多个slave

主从配置常见配置

  • mysql版本一致且后台以服务运行
  • 主从都配置在[mysqld]结点下,都是小写
  • 在主mysql服务器上配置唯一的id server-id=1
  • 配置logbin所在的位置
  • log-bin=D:/mysql-8/data/mysqlbin
  • log-err=D:/mysql-8/data/mysqlerr
  • basedir=D:/mysql-8/
  • tmpdir=D:/mysql-8/
    从数据库的配置:
    关闭server-id=1 开启server-id=2

授权从机对主机登录操作;
grant replication slave on . to “zhangsan”@“从机器数据库的ip” identifed by “密码”‘;
刷新权限:flush preivileges;
在这里插入图片描述
配置从机:
告诉从机的数据库从主机的哪个位置开始备份
命令

change master to master_host = "192.168.14.165",
master_user="zhangsan",
master_password ="123456",
master_log_file="mysqlbin.000035",master_log_pos=341;

然后接着启动从机

start slave\G;

在这里插入图片描述
这样主机每进行对数据库的插入和更新 删除操作都会同步到从机上了。

猜你喜欢

转载自blog.csdn.net/qq_43079376/article/details/106503309