1.mysql锁,
作用:解决因资源共享而造成的并发问题。
实例:买最好一件衣服X
A: X 买: X加锁----->试衣服……下单……付款……打包….------>X解锁
B: X 买: 发现X已被加锁,等待X解锁,X已售空

分类 :
操作类型:
A.读锁(共享锁):对同一个数据(衣服),多个读操作可以同时进行,互不干扰
B.写锁(互斥锁):如果当前写操作没有完毕(买衣服的一系列操作),则无法进行其他的读操作,写操作。

操作范围:
A.表锁:一次性对一张表整体加锁.
如:MYISAM存储引擎使用表锁,开销小,加锁快,无死锁;
但锁的范围大,容易发生锁冲突,并发度低;

B.行锁:一次性对一条数据加锁
如:INNODB存储引擎使用行锁,开销大,加锁慢,容易出现死锁;
但锁的范围较小,不易发生锁冲突,并发度高(很小概率发生高并发问题:脏读,幻读,不可重复读,丢失更新等)

实例:
表锁: 自增操作mysql/sqlserver支持,Oracle需要借助于序列来实现自增
Create table tablelock
(
Id int primary key auto_increment,
Name varchar(20)
)engine myisam;

Insert into tablelock(name) values('a1')
Insert into tablelock(name) values('a2')
Insert into tablelock(name) values('a3')
Insert into tablelock(name) values('a4')
Insert into tablelock(name) values('a5')

查看加锁的表: show open tables; desc emp;查表结构

增加锁: locak table 表1 read/write , 表2 read/write , …..
回话1:session
加读锁:locak table tablelock read;
select * from tablelock; -----读,可以
delete from tablelock where id=1;-------写(增删改),不可以

Select * from emp;-----读,不可以
Delete from emp where eno=1;------写,不可以

总结:会话1如果给A表加了读锁,则当前会话只能对A表进行读操作,其他表都不能操作

会话2(其它会话):
Select * from tablelock;-------读,可以
Delete from tablelock where id=1;-----写,会“等待”会话1解锁为止

Select * from emp;-------读,可以
Delete from emp where eno=1;--------写,可以

总结:会话1给A表加了锁,其它会话的操作:
A.可以除了A表的其它表进行读,写操作
B.对A表:读,可以,写要等待释放锁

释放锁:会话1执行, unlock tables;

2.加写锁:
会话1:
lock table tablelock write;

当前会话1,可以对加了锁的表进行任何操作(增删改查),但是不能操作(增删改查)其它表

其它会话2,对会话1中加写锁的表,可以进行增删改查的前提是:等待会话1释放写锁

MySQL表极锁的锁模式
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作 (DML)前,会自动给涉及的表加写锁。
所以对MyISAM表进行操作,会有以下情况:
A.对MyISAM表的读操作(加读锁),不会阻塞其它进程(会话)对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
B.对MyISAM表的写操作(加写锁),会阻塞其它进程(会话)对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

分析表锁定:
查看哪些表加了锁:show open tables;----1代表被加了锁
分析表锁定的严重程度:show status like ‘%table%’;
Table_locks_immediate:即可能获取到的锁数
Table_locks_waited:需要等待的表锁数(如果该值越大,说明存在越大的锁竞争)
一般建议Table_locks_immediate/Table_locks_waited>5000,则建议采用InnoDB引擎,否则用MyISAM引擎

行表(InnoDB)
Create table linelock(
Id int(5) primary key auto_increment,
Name varchar(20)
)engine=innodb;
Insert into linelock (name) values('1');
Insert into linelock (name) values('2');
Insert into linelock (name) values('3');
Insert into linelock (name) values('4');
Insert into linelock (name) values('5');
------mysql默认自动commit;Oracle默认不会自动commit;

为了研究行锁,暂时关闭commit;set autocommit=0;以后每条都要commit

会话1:写操作
Insert into linelock values(6,'a6'); -----------关闭commit后,在缓存里,commit后才生效
会话2:写操作同样的数据
Update linelock set name='ax' where id=6;---------想更新id为6的数据,执行时出现被锁状态,直到其它会话释放(commit)后才能操作(行锁)
提交:commit;丢弃:rollback;

对行锁情况:
1.如果会话x对数据a进行DML操作(研究时关闭了自动commit的情况下),则其它会话必须等到会话x结束事务(commit/rollback)后,才能对数据a进行操作。
2.表锁 是通过unlock tables; ,也可以通过事务解锁。行锁 是通过事务解锁。

行锁,一次锁一行数据,因此,如果操作的是不同数据,则不干扰。

3.行锁的注意事项:
A.如果没索引,则行锁会转为表锁
Show index from linelock;
Alter table linelock add index idx_linelock_name(name);

会话1:写操作
Update linelock set name='ai' where name='3';
会话2:写操作,不同的数据
Update linelock set name='aix' where name='4';

会话1:写操作
update linelock set name='ai' where name=3;
会话2:写操作,不同数据
update linelock set name='aix' where name=4;

-------->可以发现,数据被阻塞了(加锁)
-------->原因:如果索引类 发生了类型转换,则索引失效。因此此次操作,会从行锁转为表锁。

B.行锁的一种特殊情况:间隙锁:值在范围里,但却不存在。
此时linelock表中,没有id=7的数据
Update linelock set name='x' where id>1 and id<9;
mysql会自动给间隙加锁---->间隙锁,给id=7的数据加间隙锁(行锁)。
行锁:如果有where,则实际加锁的范围就是where后面的范围(不是实际的值)

行锁:innodb默认采用行锁
缺点:比表锁性能消耗大
优点:并发能力强,效率高
建议:高并发用innodb,否则用myisam

分析:show status like '%innodb_row_lock%';

Innodb_row_lock_current_waits: 当前正在等待锁的数量
Innodb_row_lock_time: 等待总时长,从系统启动到现在一共等待的时间
Innodb_row_lock_time_avg:平均等待时间
Innodb_row_lock_time_max:最长等待时间
Innodb_row_lock_waits: 系统启动到现在一共等待的次数

查询行锁:

关闭commit自动提交:
set autocommit;
start transaction;
begin;

for update对query语句加锁
Select * from linelock where id=2 for update

4.主从复制:
优点:负载均衡
失败迁移

Windows:mysql 主
Linux:mysql 从
(版本最好相近或相同)

图形客户端工具
SQLyog, Navicat

如果要远程连接数据库,则需要授权远程访问。
Windows:安装时选择可以远程访问
Linux:GRANT ALL PRIVILEGES ON *.* TO 'root' @'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;
关闭防火墙:service iptables stop

主机Windows192.168.2.2:授权那个数据库作为自己的slave
GRANT REPLICATION slave ,reload, super ON *.* TO 'root'@'192.168.2.%' IDENTIFIED BY 'root';
fulsh privileges;
show master status;

从机linux:授权那个数据库作为自己的master
CHANGE MASTER TO MASTER_HOST ='192.168.2.2',MASTER_USER='root', MASTER_PASSWORD='root' ,MASTER_PORT=3306,
master_log_file='mysql-bin.000002', master_log_pos=667;

5.主从复制:
同步的核心:二进制文件binary log
对数据库的增删改查的操作都会备份到二进制文件里
从数据库的I/O线程会从主数据库读二进制文件
Relay log通过sql线程写到从数据库

1.master将改变的数记录在本地的二进制日志中(binary log):
该过程称之为二进制日志事件
2.slave将master的binary log拷贝到自己的relay log(中继日志文件)中
3.中继日志事件,将数据读取到自己的数据库之中

mysql主从复制是异步,串行化的,有延迟的

master:slave=1:n

配置:
Windows:主mysql,my.ini
Linux:从mysql,my.cnf

配置前,为了无误,先将各防火墙,权限(远程访问)处理好

主mysql,my.ini配置文件中:
[mysqld]下,server-id=1
log-bin="mysql安装目录/data/mysql-bin" ----二进制文件
log-bin="mysql安装目录/data/mysql-error" ---错误记录文件
binlog-ignore-db=mysql ------主从同步时,忽略的数据库
binlog-do-db=test ------主从同步时,同步哪些数据库

mysql锁简谈的更多相关文章

  1. 再谈mysql锁机制及原理—锁的诠释

    加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更 ...

  2. MYSQL优化浅谈,工具及优化点介绍,mysqldumpslow,pt-query-digest,explain等

    MYSQL优化浅谈 msyql是开发常用的关系型数据库,快速.稳定.开源等优点就不说了. 个人认为,项目上线,标志着一个项目真正的开始.从运维,到反馈,到再分析,再版本迭代,再优化… 这是一个漫长且考 ...

  3. MPI简谈

    MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...

  4. .NET简谈接口

    自从面向对象开发方式的出现,抽象的概念就开始日新月异的发展,面向对象编程.面向接口编程.面向组件编程等等:这一系列的概念都是软件工程所追求的思想范畴,高类聚低耦合. 今天我要简谈的是面向对象里面非常重 ...

  5. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  6. Mysql锁初步

    存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ...

  7. mysql锁表机制及相关优化

    (该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...

  8. .NET简谈构件系统开发模式

    转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...

  9. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

随机推荐

  1. 实用脚本awk

    非常实用的awk 有时候需要去服务器下载几个日志 日志太多,翻滚起来很麻烦,操作又慢又复杂. 可以使用这个下载最新的两个文件 ls -lt | head -3 | awk -F ' ' '{if(NR ...

  2. (二)django--带APP的网站

    1.打开终端,进入到django项目,创建APP应用:python manage.py startapp news 2.在settings.py中进行注册 3.在news下新建views.py,和ur ...

  3. hystrix原理

    一.hystrix 产生背景 微服务是解决复杂服务的一个方案,在功能不变的情况下,对一个复杂的单体服务分解为多个可管理的分支.每个服务作为轻量的子服务,通过RPC实现服务间的关联,将服务简单化.每个服 ...

  4. 这一次,彻底理解Promise源码思想

    关于Promise的源码实现,网上有太多答案,我也看过很多资料,但都不是很明白.直到有一天我学完函数式编程之函子的概念,才对Promise源码有了更深刻的认识.今天,就让我们来重新认识一下Promis ...

  5. Ubuntu 16 server 安装 tensorflow-GPU

    目录 显卡驱动安装 CUDA安装 cuDNN安装 tensorflow-gpu安装 本次使用主机配置: cpu:i7-8700K     显卡:GTX-1080Ti 一.安装显卡驱动 打开命令窗口(c ...

  6. MySQL学习之路(1):SQL脚本语言

    使用MySQL数据库,首先安装MySQL数据库,本文所有SQL脚本在MySQL上测试和执行. 安装Mysql服务器:安装Mysql workbench客户端,可以以图形化界面管理mysql:安装php ...

  7. swift 实现 iOS摇一摇

    本博客包含了如何实现iOS摇一摇全步骤,包括了完整的代码. 先附上demo地址https://github.com/Liuyubao/LYBShake ,支持swift3.0+. 一.导包 项目主要使 ...

  8. 大家都说好用的 Python 命令行库:click

    作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...

  9. 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考

    本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...

  10. 第三十七章 POSIX线程(一)

    POSIX线程库相关介绍   与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都有"pthread_"开头   要使用这些函数库,都需要加入头文件"<pth ...