Homework:行级锁 表级索 乐观锁 悲观锁

1. 行级锁

只针对当前行的一种锁,行级锁是MySQL中锁定粒度最细的一种锁。
行级锁能大大减少数据库操作的冲突。 其加锁粒度最小,但开锁的开销也最大。
【行级锁分为共享锁,排他锁】

特点:
加锁慢,开销大;
会出现死锁;
锁定粒度最小,发生所冲突的概率最底,并发率也最高。

2. 表级锁

直接锁定整张表,表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少。
【表级锁分为共享锁与排他锁】

特点:
开销小,加锁快;
不会出现死锁;
锁粒度大,发出所冲突的概率最高,并发率最底。

3. 页级锁

页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。
表级锁速度快,但是冲突多,航迹冲突少,但速度慢。

特点:
开销和加锁时间界于表锁和行锁之间;
会出现死锁;
锁定粒度介于表锁和行锁之间,并发度一般。

4. 悲观锁

当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁,以防止并发。
这种借助数据库所机制,在修改数据之前先锁定(当操作相同数据而进来的请求,在一开始就会被拦住),在修改的方式被称为悲观并发控制(悲观锁)。

悲观锁主要分为共享锁和排他锁:

  • 共享锁:又称为读锁,简称S锁。是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
  • 排他锁:又称为写锁,简称X锁。就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但获取排他锁的事务可以对数据行读取和修改。

Homework:行级锁 表级索 乐观锁 悲观锁_第1张图片

但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会。

悲观锁的实现

  1. MySQL中使用悲观锁,必须关闭MySQL的自动提交,set autocommit = 0,MySQL默认使用自动提交autocommit模式,也即你执行一个更新操作,MySQL会自动将结果提交。
set autocommit = 0;
  1. 开始事务
begin;
begin work;
start transaction;  //三选一即可
  1. 根据信息输出清单
select * from tb1 where username = 'lili' for update;
  1. 进入事务并进行修改,此时已经加了悲观锁,当客户端B试图进入时,会报错(这条语句被锁住了,要释放这个锁)
    Homework:行级锁 表级索 乐观锁 悲观锁_第2张图片5. 只有当客户端A操作结束,提交事务后,客户端B才可以进行下一步操作
commit;
commit work;   //两者均可

注意:

  1. MySQL在执行查询语句(select)前,会自动给设计的所有表加读锁,在执行更新操作(update,delete,insert等)之前,会自动给设计的表加写锁。
  2. MySQL InnoDB 默认行级锁,行级锁基于索引。
  3. 在执行悲观锁时,必须在(begin/commit)中才能生效。 在进行事务操作时,通过“for update”语句,MySQL会对查询结果集中每行数据都添加排他锁,其他线程对该记录的更新与删除都会阻塞。排他锁包括行锁,表锁。

5. 乐观锁

乐观锁是相对于悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候才会正是对数据的冲突与否进行检测,如果发现冲突,则返回给用户错误的信息,让用户决定如何去做。

Homework:行级锁 表级索 乐观锁 悲观锁_第3张图片

乐观并发控制相信事务之间的数据竞争的概率是非常小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产尘任何锁和死锁。

乐观锁的实现

常用方式:版本号version
实现方式:

  1. 在数据表中增加版本号字段,每次对一条数据做更新之前,先查出该条数据的版本号,每次更新数据都会对版本韩进行更新(版本号+1);
  2. 在更新时,把之前查过的版本号与库中数据的版本号进行对比: 如果相同,则说明该条数据没有被修改过,执行更新; 如果不同,则说明该条数据已经被其他人修改过,则不更新,客户端进行相应操作提醒。

1)创建一张表时添加一个version字段,表示版本号。
Homework:行级锁 表级索 乐观锁 悲观锁_第4张图片
2)当客户端A输入信息:

update tb2 set name='lili',version=version+1 where id=1 and version=1;

3)客户端B同时操作同一个版本号则不能更新

update account set name='zhangliu',version=version+1 where id=1 and version=0;

Homework:行级锁 表级索 乐观锁 悲观锁_第5张图片

如该图所示:客户端A进行修改成功,而客户端B修改无果。

你可能感兴趣的:(概念整理)