自己总结的关于锁的理解

背景:才来公司的时候,同事让我自己看看mysql锁的知识,我理解的有点不对,所以就开始看一些关于锁的资料和文章,然后总结了一下。

共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据 ,但是只能读不能修改

排他锁又称为写锁,排他锁不能与其它锁共存,如果一个事务获得一个数据行的排他锁,其它事务就不能在获得该行的其它锁,包括共享锁和排他锁,但是获得排他锁的事务是可以对该行数据进行读取与修改的

对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的(数据修改会加锁,但是排他锁不能和其它锁共存所以不能修改数据)。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制。

当在一个session中对一条数据加了共享锁以后,在另一个session中,我们可以用普通查询和共享锁查询,但是不能使用排他锁查询数据,因为在一条数据上面,这两个锁是不能共存的

当在一个session中对一条数据加了排他锁以后,在另外一个session上面查询普通查询可以查出数据,但是使用加共享锁和排他锁的模式查询,都查不到数据

InnoDb引擎中,update、delete、insert语句会自动的加上排他锁的,使用普通查询可以查到数据,但是数据是以前的数据,当我们把数据提交,锁就释放了,现在就都能查询数据了

猜你喜欢

转载自blog.csdn.net/a12345678n/article/details/80270001