java中的锁:
-
线程是否需要同步资源
- 需要--悲观锁
- 不要--乐观锁
- 多线程竞争顺序问题
- 排队--公平锁
- 插队失败再排队--非公平锁
- 多线程能否共享一把锁
- 共享--共享锁
- 独占--独占锁
- 同一线程是否可以重复获取一把锁
- 可以--可重入锁
- 不行--不可重入锁
- 是否能中断
- 可以--可中断锁
- 不可--非可中断锁
- 等锁的过程
- 自旋--自旋锁
- 阻塞--非自旋锁
锁概述:
- 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免资源争抢,解决并发)
锁分类:
- 对数据操作粒度分:
- 表锁:操作时,锁定整张表
- 开销小,加锁快,不死锁,粒度大,锁冲突概率大 , 并发低, Myisam默认
- 行锁:操作时,锁定当前操作行
- 开销大,加锁慢,会死锁, 粒度小,锁冲突概率小 , 并发高, innodb默认
- 表锁:操作时,锁定整张表
- 对数据操作类型分:
- 读锁(共享锁):同一份数据,多哥读操作同时进行,不会相互影响
- 写锁(排它锁):当前操作没有完成之前,会阻断其他写锁和读锁
-
myisam中的锁:
- 加读锁:lock table table_name read;
- 加写锁:lock table table_name write;
- 我们不用手动加,MyISAM查询前会自动加
- myisam锁解释:
- 对myisam表的读操作:
- 不会阻塞其他用户对同一表的读请求,会阻塞对同一表的写请求
- 写操作时
- 会阻塞 读和写的操作
- myisam的读写锁是写优先,所以不适合做写为主的表的引擎,因为大量的更新会使查很难得到锁
- 对myisam表的读操作:
Innodb行锁:
- 支持事务
-
事务介绍:
- 是有一组SQL语句组成的逻辑处理单元
- 有4个属性,简称ACID
- 原子性:
- 事务是一个操作单元,对数据的修改,要么全部成功,要么全部失败
- 一致性:在食物开始和完成时,数据都必须保持一致状态
- 隔离性:数据库提供隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性:事务完成后,对数据的修改是永久的
- 原子性:
-
对于innodb行锁优化:
- 尽可能让所有数据检索都通过索引来完成,避免无索引导致行锁升级为表锁
- 合理设计索引, 尽量缩小锁的范围
- 控制事务大小,减少锁定资源量和时间长度
- 尽可能使用低级别事务隔离