一、锁
1.基本概念
MySQL的锁是为了解决资源竞争的问题,Java 里面的资源是对象,数据库的资源就是数据表或者数据行。所以锁是用来解决事务对数据的并发访问的问题的。
InnoDB锁有两种
- 表锁(意向锁,Intention Locks)
- 意向共享锁(Intention Shared Locks)
- 意向排它锁(Intention Exclusive Locks)
- 行锁
- 共享锁(Shared Locks)
- 排它锁(Exclusive Locks)
行锁的算法:
- 记录锁
- 间隙锁
- 临键锁
表锁与行锁对比:
-
锁定粒度:表锁 > 行锁
-
加锁效率:表锁 > 行锁
因为表锁只管锁住整张表,而行锁还要检索这一行数据再加锁
-
冲突概率:表锁 > 行锁
锁住一张表的时候,其他任何一个事务都不能操作这张表。但是
锁住一行数据的时候,其他的事务还可以来操作其他没有被锁的行
-
并发性能:表锁 < 行锁
2.行锁
1.共享锁(shared Locks)
简称S锁,也称读锁,多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
# 加读锁方式
select .... LOCK IN SHARE MODE;
释放锁方式:事务结束(提交或其他终止事务方式),锁自动释放