0


Mysql的锁

什么是锁

数据库的锁是为了支持对共享数据的并发访问,提供数据的完整性和一致性。

死锁

两个或者两个以上的进程在执行过程中,同时竞争共享资源造成相互等待现象。

怎么避免死锁?

  1. 为表添加合理的索引。
  2. 选择合理的事务大小,小事务发生锁冲突的几率也更小
  3. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率。

锁分类

从锁的粒度来看,又可以分为行锁、表锁、页锁

从锁概念来看,可分为悲观锁和乐观锁。

从锁的功能上看,可以分为共享锁、排他锁(独占锁)、意向锁等。共享锁也称S锁,排他锁也被称为X锁。

行锁、表锁、页锁

行锁

行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁排他锁

特点

开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

支持引擎

innodb支持行锁,myisam不支持行锁。

表级锁

表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)表独占写锁(排他锁)

特点

开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

支持引擎

innodb和myisam均支持行锁。

页级锁

页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB支持页级锁

特点

开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

支持引擎

BDB支持页级锁

悲观锁和乐观锁

悲观锁

指的是在操作数据的时候比较悲观,悲观地认为别人一定会同时修改数据,因此悲观锁在操作数据时是直接把数据上锁,直到操作完成之后才会释放锁,在上锁期间其他人不能操作数据。

乐观锁

指的是在操作数据的时候非常乐观,乐观地认为别人不会同时修改数据,因此乐观锁默认是不会上锁的,只有在执行更新的时候才会去判断在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作。

实现方式

悲观锁:for update

乐观锁:版本号机制

共享锁、排他锁、意向锁

共享锁

共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。

实现方式:

SELECT ... LOCK IN SHARE MODE;

排他锁

排他锁又称写锁,如果事务B对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

实现方式:

SELECT ... FOR UPDATE;

意向锁

意向锁是表级锁,其设计目的主要是为了在一个事务中揭示下一行将要被请求锁的类型。

意向锁是InnoDB自动加的,不需要用户干预。

标签: mysql 数据库 java

本文转载自: https://blog.csdn.net/qq_26347283/article/details/129306484
版权归原作者 lv_code 所有, 如有侵权,请联系我们删除。

“Mysql的锁”的评论:

还没有评论