本文主要是介绍mysql读锁(共享锁)与写锁(排他锁),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概述
读锁又称为共享锁
,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
写锁又称为排他锁
,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。
共享锁 很好理解,就是多个事务只能读数据不能改数据。
排他锁 指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。
mysql InnoDB
引擎默认的修改数据语句,update,delete,insert
都会自动给涉及到的数据加上排他锁,select
语句默认不会加任何锁类型。
如果加排他锁
可以使用select ...for update
语句,加共享锁
可以使用select ... lock in share mode
语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update
和lock in share mode
锁的方式查询数据,但可以直接通过select ...from...
查询数据,因为普通查询没有任何锁机制。
说了这么多,咱们来看下以下简单的例子。
for update 排他锁
有如下测试数据:
现在我们对id=1
的数据行排他查询,这里会使用BEGIN
开启事务,而不会COMMIT
提交事务,这样做是用来测试,因为提交事务或回滚事务就会释放锁。
会查询到一条数据,现在打开另一个查询窗口,对同一数据分别使用排他查
和共享锁查询
两种方式查询:
排他查:
共享查:
我们看到开了排他锁查询和共享锁查询都会处于阻塞状态,因为id=1的数据已经被加上了排他锁,此处阻塞是等待排他锁释放。
如果我们直接使用以下查询呢:
我们看到是可以查询到数据的。
LOCK IN SHARE MODE 共享锁
我们再看一下一个事务获取了共享锁,在其他查询中也加共享锁或不加锁的情况。
共享锁的事务查询,没有关闭事务
无锁查询:
共享查:
排他锁,接着使用排他锁来查询:
我们看到是不加锁的查询和共享查可以查询数据的,但加排他锁就查不到,因为排他锁与共享锁不能存在同一数据上。
InnoDb 锁机制
最后我们验证下上面说的mysql InnoDb
引擎中update,delete,insert
语句自动加排他锁的问题。
无锁查询
共享锁查询
此时共享查询处于阻塞,等待排它锁的释放,但是用普通查询能查到数据,因为没用上锁机制不与排他锁互斥,但查到的数据是修改数据之前的老数据。
然后我们提交数据,释放排他锁看下修改后的数据,此时可用排他查,共享查和普通查询, 因为事务提交后该行数据释放排他锁,下面就只显示普通查询,其他的同学们自己去验证。
可以看到结果与预期的一样。
参考了https://blog.csdn.net/c466254931/article/details/53463596#commentBox
这篇关于mysql读锁(共享锁)与写锁(排他锁)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!