为了合理贯彻落实锁的思想,MySQL中引入了杂七杂八的各种锁:
锁分类
MySQL支持三种层级的锁定 , 分别为
表级锁定
MySQL中锁定粒度最大的一种锁 , 最常使用的MYISAM与INNODB都支持表级锁定 。
页级锁定
是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁,表级锁速度快,但冲突多,行级冲突少,但速度慢 。所以取了折衷的页级,一次锁定相邻的一组记录 。
行级锁定
Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁 。行级锁能大大减少数据库操作的冲突 。其加锁粒度最小 , 但加锁的开销也最大行级锁不一定比表级锁要好:锁的粒度越细,代价越高,相比表级锁在表的头部直接加锁 , 行级锁还要扫描找到对应的行对其上锁,这样的代价其实是比较高的,所以表锁和行锁各有所长 。
MyISAM中的锁
虽然MySQL支持表,页 , 行三级锁定,但MyISAM存储引擎只支持表锁 。所以MyISAM的加锁相对比较开销低,但数据操作的并发性能相对就不高 。但如果写操作都是尾插入 , 那还是可以支持一定程度的读写并发
从MyISAM所支持的锁中也可以看出,MyISAM是一个支持读读并发,但不支持通用读写并发,写写并发的数据库引擎,所以它更适合用于读多写少的应用场合,一般工程中也用的较少 。
InnoDB中的锁
该模式下支持的锁实在是太多了,具体如下:
共享锁和排他锁 (Shared and Exclusive Locks)
意向锁(Intention Locks)
记录锁(Record Locks)
间隙锁(Gap Locks)
临键锁 (Next-Key Locks)
插入意向锁(Insert Intention Locks)
主键自增锁 (AUTO-INC Locks)
空间索引断言锁(Predicate Locks for Spatial Indexes)
举个栗子,比如行锁里的共享锁跟排它锁:lock in share modle 共享读锁:
为了确保自己查到的数据没有被其他的事务正在修改,也就是说确保查到的数据是最新的数据,并且不允许其他人来修改数据 。但是自己不一定能够修改数据 , 因为有可能其他的事务也对这些数据使用了 in share mode 的方式上了S 锁 。如果不及时的commit 或者rollback 也可能会造成大量的事务等待 。
for update排它写锁:
为了让自己查到的数据确保是最新数据 , 并且查到后的数据只允许自己来修改的时候,需要用到for update 。相当于一个 update 语句 。在业务繁忙的情况下,如果事务没有及时的commit或者rollback 可能会造成其他事务长时间的等待,从而影响数据库的并发使用效率 。
Gap Lock间隙锁:
1、行锁只能锁住行 , 如果在记录之间的间隙插入数据就无法解决了,因此MySQL引入了间隙锁(Gap Lock) 。间隙锁是左右开区间 。间隙锁之间不会冲突 。
2、间隙锁和行锁合称NextKeyLock,每个NextKeyLock是前开后闭区间 。
间隙锁加锁原则(学完忘那种):
1、加锁的基本单位是 NextKeyLock,是前开后闭区间 。
2、查找过程中访问到的对象才会加锁 。
3、索引上的等值查询,给唯一索引加锁的时候,NextKeyLock退化为行锁 。
4、索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,NextKeyLock退化为间隙锁 。
5、唯一索引上的范围查询会访问到不满足条件的第一个值为止 。
mysql事务的四大特性是什么?1、原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响 。
推荐阅读
- phpcms留言版模板文件,php留言板制作
- 鱼塘捡什么鱼好吃视频,鱼塘里面放什么鱼专吃小鱼
- mac的python编程工具,mac自带编程软件 python
- oracle存储过程中建表,oracle在存储过程中创建临时表及使用
- 包含etc/mysql怎么找的词条
- 苹果怎么传图安卓软件,苹果手机怎么传图给安卓手机
- 极品手机版赛车游戏下载,3d极品赛车单机版
- python中7%3,Python中7%3
- c语言比较三个数的函数 c语言 比较三个数