#### 锁机制:解决因资源共享,而造成的并发问题。
锁机制:解决因资源共享,而造成的并发问题。
分类-
操作类型:
-
读锁(共享锁):对同一个数据,多个读操作可以同时进行,互不干扰
- 写锁(互斥锁):如果当前写操作没完毕,则无法进行其他的读操作、写操作操作
-
操作范围:
-
表锁:一次性对一张表整体加锁。如MyISAM存储引擎使用表锁,开销小,加锁块,无死锁,但锁范围大,容易发生锁冲突,并发效率低
- 行锁:一次性对一条数据加锁。如InnoDB存储引擎使用行锁,开销大,加锁慢;容易出现死锁,但锁的范围小,不易发生锁冲突,并发度高(很小概率 发生高并发问题:脏读,幻读,不可重复读)
- 页锁
-
示例:
表锁:
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’);
commit;
在表锁范围内加锁语法: lock table 表1 read /write , 表2 read/write ,…查看加锁的表:
show open tables;
都没有加锁。
开启两个会话 都登录mysql 使用同一个库,同一张表 测试
在第一个 会话加锁 lock table tablelock read;
测试读锁:对同一个数据,多个读操作可以同时进行,互不干扰
测试查询
会话1(加锁的会话):
对于加锁的表:
select * from tablelock ;–读,可以
delete from tablelock where id=1;–写操作,不可以
出现了错误:ERROR 1099 (HY000): Table ‘tablelock’ was locked with a READ lock and can’t be updated
对于其他表:
select * from emp;-读,不可以;
出现错误:Table ‘emp’ was not locked with LOCK TABLES;
delete from emp where eid=1; 写,不可以
出现同样的错误;
会话2(非加锁会话):
对于加锁的表:
select * from tablelock ;–读,可以
delete from tablelock where id=1;–写操作,陷于阻塞等待
对于其他的表:
select * from dept;–读操作,可以
delete from dept where dno=10;-写操作,可以
总结: 如果某个会话对A表加了read锁,则该会话可以对该表进行读操作、不能进行写操作,且该会话不能对其他表进行读操作、写操作; 对于其他会话,可以对加read锁的表读操作,但对于该表的写操作陷于阻塞等待,,对于其他非加锁的表可以进行读操作、写操作 释放锁语法:unlock tables;
释放锁后 其他会话陷于等待的写操作就可以进行了
发现该会话对加锁表陷于阻塞等待了14分钟直到锁被释放才可以完成操作
会话1:
加写锁 :lock table tablelock write;
测试:select * from tablelock ;
delete from tablelock where id=1;
对于其他表:
select * from dept;
其他会话:
测试:select * from tablelock ;
进行读操作 陷于阻塞等待
delete from tablelock where id=1;
进行写操作 陷于阻塞等待
对于其他表:
select * from dept;
可以正常读操作;
delet from dept where dno=10;
写操作可以正常使用;
MyISAM在执行查询语句前,会自读给涉及到的所有表进行加读锁,在执行更新操作(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引擎
后续请看博客[http://www.yunhaiguil.wang]
- 点赞
- 收藏
- 分享
- 文章举报
- 使用redis分布式锁解决并发线程资源共享问题
- 使用redis分布式锁解决并发线程资源共享问题
- win7 共享的问题,"您可能没有权限使用网络资源"的解决办法
- 如何解决多线程并发访问一个资源的安全性问题?
- win7问题解决,凭据管理器和无法访问,不允许一个用户使用一个以上用户名与服务器或共享资源进行多重连接。
- CORS(跨域资源共享)跨域问题及解决
- java回忆录(3)—ThreadLocal解决线程资源共享问题
- 转载一篇觉得不错的文章,关于并发访问资源共享问题
- 理解B/S结构中服务端同步与异步机制的区别,通过使用ASP.Net异步处理节约队列时间成本,解决大并发量问题
- java服务端解决js跨域的问题 CORS(跨域资源共享) 的配置
- win7问题解决,凭据管理器和无法访问,不允许一个用户使用一个以上用户名与服务器或共享资源进行多重连接。
- 解决前后端分离的 CORS 跨域资源共享问题
- 共享文档 没有权限访问该资源 的棘手问题解决思路
- 基于Oracle数据库锁机制,解决集群中的并发访问问题
- 解决前后端分离的 CORS 跨域资源共享问题
- 解决”不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接“问题
- Java服务端Cors跨域资源共享配置,解决与Spring Security冲突引起的问题
- 解决”不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接“问题
- Java服务端Cors跨域资源共享配置,解决与Spring Security冲突引起的问题
- 【原创】构建高性能ASP.NET站点 第七章 如何解决内存的问题(前篇)—托管资源优化—垃圾回收机制深度剖析