mysql中的锁

mysql中的锁

1.根据锁的兼容性:排他锁和共享锁

排他锁:

表级别:lock table 表名 write
行级别:Select …… for undate

如果事务T对A上了排他锁,那么其他事务都不能对A加任何类型的锁,获得锁的事务既可以读操作也可以写操作

共享锁:

表级别:lock table 表名 read
行级别:Select …… Lock in share mode
如果事务T对A加了共享锁,那么其他事务只能对A加共享锁,不能加其他锁,获得共享锁的事务只能进行读操作。

对于mysql默认存储引擎innodb来说,所有的修改数据的语句,update、delete、insert都会对数据加上排他锁。
而select语句默认不会加任何锁,所以如果加了排他锁或者共享锁,用select不加锁的语句也可以进行读操作

2.根据锁的粒度:表锁、页锁、行锁

MyIsam存储引擎:支持表锁,表锁并发度高,加锁块,冲突概率最高,粒度最大
BDB存储引擎:支持表锁和页锁。默认为页锁,页锁的锁定粒度在表锁和行锁之间,会出现死锁
Innodb存储引擎:支持表锁、行锁,默认为行锁。行锁是mysql中粒度最小的锁,只有在通过索引条件索引数据时才能使用行级锁,否则就使用表级锁。行级锁加锁慢,开销大,发生锁冲突概率最低,并发度高。

3.根据锁的机制:悲观锁和乐观锁

悲观锁:

在数据处理过程中,使数据处于锁定状态,一般使用数据库锁机制实现。

乐观锁:

通过记录数据版本的方式实现乐观锁。

4.根据锁的模式:记录锁、gap锁、next-key锁、意向锁

记录锁:把一条记录锁上
gap锁:间隙锁,锁定一个范围,但是不包含记录本身
Next-key锁:记录锁+gap锁的组合,锁定一个范围,并且锁定记录本身

意向锁:在innodb存储引擎中对表里的某些记录加上共享锁/排他锁之前,需要先在表级别加上意向共享锁/意向排他锁。也就是说在使用update、delete、insert语句的时候,需要先对表加上意向独占锁。
意向锁的目的是为了快速判断表里是否有记录被加锁,服务表锁。
因为如果有了意向锁,在加表独占锁的时候,就可以通过判断有没有意向锁来判断表中是否有记录被加锁了,没有意向锁的话,就需要遍历每条记录。

意向锁,不论是意向排他锁还是意向共享锁都不会相互排斥,同时,意向排他锁和意向共享锁和所有的行级别的共享锁和排他锁也都不排斥。但是对于表级锁来说,除了意向共享锁和表级读锁,其他的意向锁和表级别锁都是相互排斥的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值