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; 这样就给这行加上了锁;
在之后的操作中,这一行的操作只有我们自己能操作该行的数据,其它的需要阻塞等待;
主从复制
复制的基本原理:
- slave 会从master读取binlog来进行数据同步,这些记录过程叫做二进制日志事件;
- slave 将master的binary log events拷贝到它的中继日志中;
- slave重做中继日志中的事件,将改变应用到自己的数据库中,mysql的复制是异步的且串行化的
复制的基本规则 - 每个slave只有一个master
- 每个master只能有一个唯一的服务器ID
- 每个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;
这样主机每进行对数据库的插入和更新 删除操作都会同步到从机上了。