一、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): |