Mysql的行级锁和表级锁

Mysql的行级锁和表级锁

# 锁可以用于确保事务的完整性和数据库的一致性.
		可以防止用户读取其他用户正在整改的数据 (----->脏读 )
		可以防止多贵用户同时更改相同的数据( ------> 和不可重复读的意思差不多)
		
* 按照锁的粒度将数据库的锁分为
	行级锁		(InnoDB引擎)
	表级锁		(MYISAM引擎)
	页级锁		(DBD引擎)
# 行级锁:
	行级锁是mysql中锁定粒度最细的一种锁,表示只对当前的操作行进行加锁
	
* 特点:
	1. 行级锁能够减少对数据库的冲突
	2. 锁定的粒度最小(就是加锁的东西更小)
	3. 加锁慢,开销大 (因为涉及到每一行 ,所以加锁慢,开销大)
	4. 并发最高
	
* 行级锁分为:
		共享锁
		排他锁
		
# 行级锁是基于索引的,如果sql语句中没有索引的话,是不会用到行级锁的,还是会使用表级锁的

	在mysql中,行级锁并不是直接的锁记录,而是锁的是索引
	索引分为主键索引和非主键索引
	如果一条sql语句操作了主键索引,那么mysql就会锁定这个主键索引
	如果一条sql语句操作了非主键索引,那么mysql就会先锁定这个非主键索引,然后再锁定其他的相关的主键索引
# 表级锁:
	表级锁是mysql中锁定的粒度最大的一种锁,表示对当前的整张表加锁
	
* 特点: 
	1. 开销小,加锁块
	2. 不会出现死锁
	3. 锁定的粒度最大
	4. 并发最低
	
* 表级锁分为:
		表共享读锁(共享锁)
		表独占写锁(排他锁)
		
# 页级锁:
	页级锁是mysql中锁粒度介于行级锁和表级锁之间的一种锁
	一次只能锁定一组记录
	
* 特点:
	开销和加锁的时间界于表锁和行锁之间,并发一般
	
# mysql中的常用的引擎的锁机制
	MYISAM和MEMORY采用的是 表级锁
	InnoDB支持表级锁和行级锁,默认的是行级锁
	
# InnoDB中的行级锁和表级锁

* InnoDb 支持表级锁也支持行级锁,那什么时候会锁定整张的表什么时候锁定一行的数据呢

1. innodb中行级锁的特点:

		1. InnoDB行锁是通过给索引项加锁来实现的
		2. 也就是只有通过索引检索数据,InnoDB才使用行级锁,否则就使用表级锁
		
	行级锁都是基于索引的,如果sql语句用不到索引是不会使用行级锁的,会使用表级锁
	
	行级锁的特点是: 加锁的粒度小,消耗的资源比较大,并发最高,锁冲突比较少
	
	
2. 行级锁和死锁:

		myiasm中不会产生死锁的现象,因为myisam总是一次性获取所需要的全部的锁,要么全部满足,要么全部等待
		innodb中可能会出现死锁的现象,因为innodb操作的是行级锁,锁是逐步获取的
	
	2.1 死锁出现的原因:
		在两个事务中,一个锁锁住了主键索引,在等待其他的相关索引
		另一个事务锁定了非主键索引,在等待主键索引
		
	2.2 innodb解决死锁的方法:
		发生死锁后,innodb一般都可以检测的到,并且使一个事务释放锁退回,另一个获取锁完成事务
	
	2.3 避免死锁的办法:
		1. 如果不同的程序并发存取多个表,尽量约定以相同的顺序访问表,可以大大的降低死锁的机会
		2. 在同一个事务中,尽可能做到一次锁定所需要的所有的资源,减少死锁产生的概率
		3. 对于非常容易产生死锁的业务部分,可以尝试锁的粒度,把行级锁升级为表级锁
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值