快速了解行锁、表锁、排他锁、共享锁

原创
2017/06/19 11:29
阅读数 406

1、什么事是锁?

锁是为了保证多个事务同时访问和修改同一个数据的情况下,把事务进行串行化,最后保证数据一致性的一种机制;

 

2、mysql锁的分类

 

共享锁(读锁 S):某个对象对某数据加共享锁之后可以对数据进行读取,其他对象可以同时对该数据加共享锁(其他人可以同时对该数据同时进行读取),但不允许其他对象包括自己对数据加排他锁(在查询中不能对数据进行修改);

手动加读取锁:LOCK tables test_db  read 释放锁:UNLOCK TABLES;

 

排他锁(写锁 X):某个对象对某数据加排他锁之后(自身可对数据进行读取和修改),其他对象不允许对该数据加共享锁(不能对该数据进行读取)和排他锁(不能对该对象进行修改)

手动加写锁:LOCK tables test_db  WRITE释放锁:UNLOCK TABLES;

 

3、mysql加锁的几种方式:

(1)表锁:使用表锁的方式请求会对整个表进行加锁,其他需要操作该表的请求都会被阻拦,只有等前一个操作把锁释放才下一个请求获取到该表的锁才可以对该表进行操作;

 

特点:加锁快,开销少(数据库加锁是通过索引的方式找到对应的数据进行加锁,找表要比找行速度要快)但锁粒度大(锁的粒度是在表身上)这种方式在高并发写的环境中性能低;

 

适用场景:表以读取为主,只有少量修写的情况下;

 

(2)行锁:试用行锁的方式请求会对表数据的某一行或者多行进行加锁,其他请求可以针对该表的其他数据行进行操作,但如果对同一行进行操作还是会以串行的方式来执行请求;

行锁加锁原理是通过对数据索引进行加锁;

 

特点:加锁慢,开销大,但锁粒度小(锁是加在对应的数据行上),多个请求可以同时请求同一张表不同数据,减少锁的冲突,这种方式利于高并发写的环境;

 

适用场景:表并发写的请求较多;

 

(3)页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部