数据库中的锁

一、mysql中的锁机制

1、行锁

引擎:InnoDB

(1)、记录锁:将查询范围内的行都锁上,共享锁(读锁)和排它锁(写锁)

(2)、间隙锁:锁定一个范围,防止其他事务操作间隙插入或删除数据,目的是为了解决幻读,只有在可重复读的和串行化读隔离级别才有

(3)、临建锁:记录锁+间隙锁;用于解决当前读下的幻读

2、表锁

引擎:InnoDB和Myisam都支持

表锁是一种悲观锁,分为表共享锁与表排它锁,不会出现死锁现象

3、页锁

引擎:InnoDB

页锁,即锁住B+树的一次IO读写的磁盘块,因此锁住的是一组相邻的数据;粒度介于行锁与表锁之间,会出现死锁。

二、悲观锁和乐观锁

1、乐观锁

适用场景:读多、读写冲突少

原理:只在提交的时候检查是否违反数据完整性

(1)、CAS算法(失败重试)

(2)、版本号机制(每次更新时,版本号Version+1,当线程做更新时就会读版本号Version,对比读到的版本号和数据之前的版本号是否一致,是则提交更新,否则提交失败)

2、悲观锁

适用场景:写多,读写冲突多

原理:直接通过排他锁或共享锁锁住【行、表、页】,屏蔽一切可能违反数据完整性的操作

三、如何避免死锁

解决方式
(1)约定读取表的顺序

(2)同一事务内,一次锁定全部需要的资源

(3)升级锁的粒度,升级为页锁或者表锁
(4)乐观锁 或者 分布式锁(redis):

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值