【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

MySQL 意向锁与其他锁定机制的比较:了解优势和局限性

用户投稿2024-04-17热门资讯28

锁定是数据库管理系统 (DBMS) 中一种重要的机制,用于管理对数据的并发访问。MySQL 提供了多种锁定机制,包括意向锁和排他锁。

意向锁

意向锁是一种非排他性锁定,它允许多个事务同时读取数据,但不能同时更新数据。意向锁有两种类型:

  • IS (意向共享锁):表示事务打算在未来读取数据。
  • IX (意向独占锁):表示事务打算在未来更新数据。

意向锁对性能的影响很小,因为它不会阻止其他事务读取数据。但是,它可以防止其他事务更新数据,直到持有意向锁的事务释放锁为止。

排他锁

排他锁是一种排他性锁定,它只允许一个事务同时访问数据。排他锁有两种类型:

  • S (共享锁):允许多个事务同时读取数据,但不能更新数据。
  • X (独占锁):只允许一个事务同时读取和更新数据。

排他锁可以防止其他事务访问数据,直到持有排他锁的事务释放锁为止。排他锁对性能的影响较大,因为它可以导致其他事务等待访问数据。

意向锁和排他锁的比较

下表比较了意向锁和排他锁的主要特点:

特征 意向锁 排他锁
排他性 非排他 排他
类型 IS (意向共享锁)
IX (意向独占锁)
S (共享锁)
X (独占锁)
性能影响
用途 提高读取性能 防止并发更新

意向锁的优势

提高读取性能:意向锁允许多个事务同时读取数据,从而提高读取性能。减少死锁:意向锁通过防止其他事务更新数据,直到持有意向锁的事务释放锁为止,可以减少死锁的可能性。提高并发性:意向锁允许多个事务同时访问数据,从而提高并发性。

意向锁的局限性

无法防止脏读:意向锁不能防止脏读,即一个事务读取另一个事务尚未提交的更新。无法防止不可重复读:意向锁不能防止不可重复读,即一个事务多次读取同一行数据,每次读取的结果不同。无法防止幻读:意向锁不能防止幻读,即一个事务多次执行相同的查询,但每次返回不同的行数。

何时使用意向锁

当需要提高读取性能时。当需要减少死锁的可能性时。当需要提高并发性时。

何时不使用意向锁

当需要防止脏读、不可重复读或幻读时。当需要确保事务的原子性时。当需要防止其他事务更新数据时。

结论

意向锁是一种有用的锁定机制,它可以提高读取性能、减少死锁和提高并发性。但是,它也有其局限性,并且不适合在所有情况下使用。在选择使用哪种锁定机制时,必须权衡意向锁和排他锁的优势和局限性。

Innodb锁机制

InnoDB实现了两种类型的行锁。 共享锁(S) :允许一个事务去读一行,阻止其他事务获得相同的数据集的排他锁。 排他锁(X) :允许获得排他锁的事务更新数据,但是组织其他事务获得相同数据集的共享锁和排他锁。 可以这么理解: 共享锁就是我读的时候,你可以读,但是不能写。 排他锁就是我写的时候,你不能读也不能写。 其实就是MyISAM的读锁和写锁,但是针对的对象不同了而已。 除此之外InnoDB还有两个表锁:意向共享锁(IS) :表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁意向排他锁(IX) :类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。 意向锁是InnoDB自动加的,不需要用户干预。 对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X);对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显示加共享锁或排他锁。 共享锁:select * from table_name where in share mode 排他锁:select * from table_name where update InnoDB行锁是通过给索引项加锁实现的,索引分为主键索引和非主键索引两种,如果 一条 sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引,如果没有索引,InnoDB会通过隐藏的聚簇索引来对记录加锁。 也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,实际效果跟表锁一样。 InnoDB对于行的查询都是采用了Next-Key Lock的算法,锁定的不是单个值,而是一个范围(GAP)。 上面索引值有1,3,5,8,11,其记录的GAP的区间如下:是一个 左开右闭 的空间(原因是默认主键的有序自增的特性,结合后面的例子说明) (-∞,1],(1,3],(3,5],(5,8],(8,11],(11,+∞) InnoDB对于行的查询都是采用了Next-Key Lock的算法,锁定的不是单个值,而是一个范围,按照这个方法是会和第一次测试结果一样。 但是,当查询的索引含有唯一属性的时候,Next-Key Lock 会进行优化,将其降级为Record Lock,即仅锁住索引本身,不是范围。 Next-Key Lock是行锁与间隙锁的组合,这样,当InnoDB扫描索引记录的时候,会首先对选中的索引记录加上行锁(Record Lock),再对索引记录两边的间隙加上间隙锁(Gap Lock)。 如果一个间隙被事务T1加了锁,其它事务是不能在这个间隙插入记录的。

mysql innodb存储引擎行级锁问题

概念:锁是用来管理对共享文件的并发访问。 innodb会在行级别上对数据库上锁。 不过innodb存储引擎会在数据库内部其他多个地方使用锁,从而允许对不同资源提供并发访问。 例如操作缓冲池中的LRU列表,删除,添加,移动LRU列表中的元素,为了保证一致性,必须有锁的介入。 MyISAM引擎是表锁,而InnoDB提供一致性的非锁定读、行级锁,且行级锁没有相关额外的开销。 锁table-level locking(表级锁)整个表被客户锁定。 根据锁定的类型,其他客户不能向表中插入记录,甚至从中读数据也受到限制MyISAM、MEMORY默认锁级别,个别时候,InnoDB也会升级为表级锁row-level locking(行级锁)只有线程当前使用的行被锁定,其他行对于其他线程都是可用的InnoDB默认行级锁。 是基于索引数据结构来实现的,而不是像ORACLE的锁,是基于block的。 InnoDB也会升级为表级锁,全表/全索引更新,请求autoinc锁等page-level locking(页级锁)锁定表中某些行集合(称做页),被锁定的行只对锁定最初的线程是可行。 如果另外一个线程想要向这些行写数据,它必须等到锁被释放。 不过其他页的行仍然可以使用BDB默认页级锁lock与latchlatch称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短。 若持续的时间长,则应用的性能会非常差。 在InnoDB存储引擎中,又可以分为mutex(互斥量)和rwlock(读写锁)。 其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。 latch可以通过命令show engine innodb mutex来进行查看。 如图:由上图可以看出列Type显示的总是InnoDB,列Name显示latch的信息以及所在源码的行数,列Status中显示的os_waits表示操作系统等待的次数。 lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。 并且一般lock的对象仅在事务commit或者rollback后释放(不同事务隔离级别释放的时间可能不一样)。 有死锁机制。 二则的区别如下:特点:InnoDB是通过对索引上的索引项加锁来实现行锁。 这种特点也就意味着,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。 锁的类型:有两种标准的行级锁:共享锁(S lock):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁 * FROM table_name WHERE ... LOCK IN SHARE MODE排它锁(X lock):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他锁 * FROM table_name WHERE ... FOR UPDATEInnoDB存储引擎支持意向锁且设计比较简练,分为两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁。 (意向锁是InnoDB自动加的)意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁.意向独占锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁.

MySQL白菜教程(Level 10 - 意向锁&记录锁&间隙锁)

意向锁(Intention Locks; table-level lock) 意向锁是一种特殊的表级锁,意向锁是为了让 InnoDB 多粒度的锁能共存而设计的。取得行的共享锁和排他锁之前需要先取得表的意向共享锁(IS)和意向排他锁(IX),意向共享锁和意向排他锁都是系统自动添加和自动释放的,整个过程无需人工干预

意向锁就是指未来的某一个时刻事务可能要加共享锁或者排它锁,提前声明一个意向,分为两种:

意向共享锁(Intention Shared Lock) IS 事务有意向对表中的某些行加共享锁(S锁)

意向排它锁(Intention Exclusive Lock)IX 事务有意向对表中的某些行加排他锁(X锁)

MySQL 意向锁与其他锁定机制的比较:了解优势和局限性 第1张

记录锁(Record Locks) 官方原文

SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 这一行则是使用了记录锁,不允许其他事务进行增,删,改 但是SELECT c1 FROM t WHERE c1 = 10; 是没有锁的,走的是快照读,上文已经阐明过了 记录锁本身不是锁定记录数据本身而是锁定索引记录,如果要锁的列没有索引,则会进行全表记录加锁

间隙锁(Gap Locks) 官方原文

比如SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE ; 插入 c1 为 15 的记录会被锁定不可执行 这种默认存在于可重复读的事务隔离级别中的锁,锁定被圈定的范围不允许 insert,防止不可重复读,上文说了我们的事务隔离级别都是读已提交,默认会产生不可重复读的问题

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

MySQL 意向锁与其他锁定机制的比较:了解优势和局限性 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
欢迎你第一次访问网站!