精华内容
下载资源
问答
  • 主要介绍了mysql共享锁与排他锁用法,结合实例形式分析了mysql共享锁与排他锁相关概念、原理、用法及操作注意事项,需要的朋友可以参考下
  • 共享锁与排他锁

    2015-03-05 14:45:05
    如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。 获准共享锁的事务职能读取数据,不能修改数据。 排他锁(X锁): 如果事务T对数据A加上排他锁后,则其他事务不能在对A加任何类型的...

    共享锁(S锁):

    如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。

    获准共享锁的事务职能读取数据,不能修改数据。

    排他锁(X锁):

    如果事务T对数据A加上排他锁后,则其他事务不能在对A加任何类型的封锁。

    获准排他锁的事务既能读取数据,也能修改数据。

     

    数据库死锁的原因:若干事务相互等待对方释放封锁,就陷入了无限期等待状态,系统进入死锁。

     

    预防数据库死锁的方法:

    1、要求一个事务必须一次性封锁所需要的所有数据(要么全成功,要么全部成功)

    2、规定封锁数据的顺序,所有事务必须按照这个顺序实行封锁

     

    解除数据库死锁的方法:允许死锁发生,然后解除它,如果发现死锁,则将其中一个代价较小的事务撤销,回滚这个事务,并释放此事务持有的封锁,使其他事务继续进行。

    展开全文
  • mysql共享锁与排他锁

    2018-07-23 19:27:20
    mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据...

    mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对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...查询数据,因为普通查询没有任何锁机制。

    说了这么多,咱们来看下以下简单的例子:

    我们有如下测试数据

     

    现在我们对id=1的数据行排他查询,这里会使用begin开启事务,而不会看见我关闭事务,这样做是用来测试,因为提交事务或回滚事务就会释放锁。

    打开一个查询窗口

     

    会查询到一条数据,现在打开另一个查询窗口,对同一数据分别使用排他查和共享锁查询两种方式查询

    排他查

    共享查

    我们看到开了排他锁查询和共享锁查询都会处于阻塞状态,因为id=1的数据已经被加上了排他锁,此处阻塞是等待排他锁释放。

    如果我们直接使用以下查询呢

    我们看到是可以查询到数据的。

    我们再看一下一个事务获取了共享锁,在其他查询中也只能加共享锁或不加锁。

    我们看到是可以查询数据的,但加排他锁就查不到,因为排他锁与共享锁不能存在同一数据上。

    最后我们验证下上面说的mysql InnoDb引擎中update,delete,insert语句自动加排他锁的问题,

    此时共享查询处于阻塞,等待排它锁的释放,但是用普通查询能查到数据,因为没用上锁机制不与排他锁互斥,但查到的数据是修改数据之前的老数据。

    然后我们提交数据,释放排他锁看下修改后的数据,此时可用排他查,共享查和普通查询, 因为事务提交后该行数据释放排他锁,下面就只显示普通查询,其他的同学们自己去验证。

    可以看到结果与预期的一样。

    以上为我对mysql中共享锁与排他锁的个人理解,有不正确的地方还希望各位指正。

    展开全文
  • mysql共共享享锁锁与与排排他他锁锁用用法法实实例例分分析析 这篇文章主要介绍了mysql共享锁与排他锁...mysql锁机制分为表级锁和行级锁本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流 共享锁
  • MySQL共享锁与排他锁

    千次阅读 2018-10-22 12:50:53
    mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,...

    本文转发自:https://www.cnblogs.com/boblogsbo/p/5602122.html

    mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对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…查询数据,因为普通查询没有任何锁机制。

    说了这么多,咱们来看下以下简单的例子:

    我们有如下测试数据
    在这里插入图片描述

    现在我们对id=1的数据行排他查询,这里会使用begin开启事务,而不会看见我关闭事务,这样做是用来测试,因为提交事务或回滚事务就会释放锁。

    打开一个查询窗口
    在这里插入图片描述
    会查询到一条数据,现在打开另一个查询窗口,对同一数据分别使用排他查和共享锁查询两种方式查询

    排他查

    在这里插入图片描述

    共享查

    在这里插入图片描述
    我们看到开了排他锁查询和共享锁查询都会处于阻塞状态,因为id=1的数据已经被加上了排他锁,此处阻塞是等待排他锁释放。

    如果我们直接使用以下查询呢

    在这里插入图片描述

    我们看到是可以查询到数据的。

    我们再看一下一个事务获取了共享锁,在其他查询中也只能加共享锁或不加锁。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    我们看到是可以查询数据的,但加排他锁就查不到,因为排他锁与共享锁不能存在同一数据上。

    最后我们验证下上面说的mysql InnoDb引擎中update,delete,insert语句自动加排他锁的问题,

    在这里插入图片描述

    在这里插入图片描述

    此时共享查询处于阻塞,等待排它锁的释放,但是用普通查询能查到数据,因为没用上锁机制不与排他锁互斥,但查到的数据是修改数据之前的老数据。

    在这里插入图片描述

    然后我们提交数据,释放排他锁看下修改后的数据,此时可用排他查,共享查和普通查询, 因为事务提交后该行数据释放排他锁,下面就只显示普通查询,其他的同学们自己去验证。

    在这里插入图片描述

    在这里插入图片描述

    可以看到结果与预期的一样。

    以上为我对mysql中共享锁与排他锁的个人理解,有不正确的地方还希望各位指正。

    展开全文
  • mysql中的共享锁与排他锁

    千次阅读 2017-02-16 17:08:27
    原文出处:MySQL中的共享锁与排他锁 在 MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。行级锁分为共享锁排他锁两种,本文将详细介绍...

    原文出处:MySQL中的共享锁与排他锁


    MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突。行级锁分为共享锁排他锁两种,本文将详细介绍共享锁及排他锁的概念、使用方式及注意事项等。

    共享锁(Share Lock)

    共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。

    如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获得共享锁的事务只能读数据,不能修改数据

    用法

    SELECT ... LOCK  IN SHARE MODE;

    在查询语句后面增加 LOCK IN SHARE MODE,Mysql会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。

    排他锁(eXclusive Lock)

    共享锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的锁,其它事务也不能对A做update,insert,delete操作,因为在innodb中这些操作默认加了排他锁,可以进行select 操作因为查询的时候是不加任何锁的。

    用法

    SELECT ... FOR UPDATE;

    在查询语句后面增加 FOR UPDATE,Mysql会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。

    意向锁

    InnoDB还有两个表锁:

    意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁

    意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。

    意向锁是InnoDB自动加的,不需要用户干预。

    对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X);对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显示加共享锁或排他锁。

    共享锁: SELECT ... LOCK IN SHARE MODE;

    排他锁: SELECT ... FOR UPDATE;

    注意事项

    行级锁与表级锁

    行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁。行级锁的缺点是:由于需要请求大量的锁资源,所以速度慢,内存消耗大。

    行级锁与死锁

    MyISAM中是不会产生死锁的,因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待。而在InnoDB中,锁是逐步获得的,就造成了死锁的可能。

    在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。 在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking。

    当两个事务同时执行,一个锁住了主键索引在等待其他相关索引,一个锁定了非主键索引,在等待主键索引。这样就会发生死锁。

    发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务。

    有多种方法可以避免死锁,这里只介绍常见的三种

    1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。

    2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;

    3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

    参考资料:

    MySQL表级锁与行级锁

    MySQL锁的用法之行级锁

    Mysql中那些锁机制之InnoDB


    展开全文
  • mysql 共享锁与排他锁

    2017-11-15 19:09:43
    mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,404
精华内容 14,161
关键字:

共享锁与排他锁