本文主要是介绍行级锁 表级锁 乐观锁 悲观锁的描述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、行级锁和表级锁
- 首先从锁的颗粒级别来看可分为三种:表级,页级,行级。从引擎的角度看
Innodb
支持表级锁和行级锁,myisam
只支持表级锁。其中行级锁又分为:共享锁和排他锁。
- 共享锁——称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。但是使用共享锁的方法是在
select ... lock in share mode,
只适用查询语句。- 排他锁——排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。说明:使用排他锁的方法师在sql末尾加上
for update
,顺便一提在innodb
引擎中,会默认在update,delete这种操作加上for update
。在mysqlinnodb
中,行级锁的实现其实是依靠其对应的索引,所以如果操作的行并有用到索引,那么用的还是表级锁。
2、 乐观锁和悲观锁
- 首先先给大家大概介绍一个并发控制——当程序中可能出现并发的情况时,就需要通过一定的手段来保证在并发情况下数据的准确性,通过这种手段保证了当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。这种手段就叫做并发控制。并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。说明:没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。实现并发控制的主要手段大致可以分为乐观并发控制和悲观并发控制两种。
1、乐观锁——当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制。
悲观锁主要分为共享锁或排他锁:
- 共享锁【Shared lock】又称为读锁,简称S锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。、
排他锁【Exclusive lock】又称为写锁,简称X锁。顾名思义,排他锁就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据行读取和修改。
2、悲观锁——乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。
这篇关于行级锁 表级锁 乐观锁 悲观锁的描述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!