10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 下载本手册 从本手册中摘录

8.11.1内部锁定方法

本节讨论内部锁定;也就是说,在MySQL服务器本身中执行锁定,以管理多个会话对表内容的争用。这种类型的锁定是内部的,因为它完全由服务器执行,不涉及其他程序。有关其他程序对MySQL文件执行的锁定,请参阅第8.11.5节,“外部锁定”.

行级锁定

MySQL使用行级锁定对于InnoDB公司要支持多个会话的同时写入访问的表,使其适用于多用户,高度并发和OLTP应用程序。

避免死锁在单个服务器上执行多个并发写操作时InnoDB公司表,通过发出a,在交易开始时获得必要的锁选择...进行更新语句,即使数据更改语句出现在事务的后面。如果事务修改或锁定多个表,则在每个事务中以相同的顺序发出适用的语句。死锁影响性能而不是表示严重错误,因为InnoDB公司自动检测默认情况下的死锁条件并滚动受影响的事务之一。

在高并发系统上,死锁检测可能会导致众多线程等待同一锁时会导致放缓。有时,禁用死锁检测并依赖于此可能更有效innodb\锁定\等待\超时发生死锁时的事务回滚设置。可以使用死锁检测innodb死锁检测配置选项。

行级锁定的优点:

  • 当不同的会话访问不同的行时,锁冲突更少。

  • 回滚更改更少。

  • 可以长时间锁定一行。

台面锁定

MySQL使用台面锁定对于密萨姆,记忆,和合并表,一次只允许一个会话更新这些表。此锁定级别使这些存储引擎更适合于只读、多读或单用户应用程序。

这些存储引擎避免死锁通过始终在查询的开头请求一次性锁定,并始终以相同的顺序锁定表。权衡是该策略减少了并发性;想要修改表的其他会话必须等到当前数据更改语句完成。

表级锁定的优点:

  • 所需内存相对较少(行锁定要求每行或一组锁定的行具有内存)

  • 在表的很大一部分上使用时速度很快,因为只涉及一个锁。

  • 如果你经常这么做,那就快点分组依据在大部分数据上的操作或必须经常扫描整个表。

MySQL授权表写入锁如下:

  1. 如果表上没有锁,请在其上设置写锁。

  2. 否则,将锁请求放入写锁队列。

MySQL Grants表读锁如下:

  1. 如果表上没有写锁,请在其上设置读锁。

  2. 否则,将锁请求放入读锁队列。

表更新的优先级高于表检索。因此,当释放锁时,该锁将对写锁队列中的请求可用,然后对读锁队列中的请求可用。这样可以确保不更新表饿死即使有沉重的选择表的活动。但是,如果一个表有许多更新,选择语句将等待,直到不再有更新。

有关更改读写优先级的信息,请参阅第8.11.2节“表锁定问题”.

您可以通过检查表\u锁定\u立即表\u锁定\u等待状态变量,分别表示可以立即授予表锁请求的次数和必须等待的次数:

mysql>显示状态,如“Table%”;+--------------------------+-----------+|变量|名称|值|+-------------------------------+|表|锁|立即| 1151552 | |表|锁| 15324 |+-----------------------+---------+

性能架构锁定表还提供锁定信息。看第27.12.13节“性能架构锁表”.

这个密萨姆存储引擎支持并发插入,以减少给定表的读写器之间的争用:如果密萨姆表在数据文件的中间没有空闲块,行总是插入到数据文件的末尾。在这种情况下,您可以自由混合并发选择A的陈述密萨姆没有锁的桌子。也就是说,可以将行插入到密萨姆表同时其他客户正在从中读取。可以在表中删除或更新的行中删除的孔来导致孔。如果有孔,则禁用并发插入,但是当所有孔填充新数据时,都会自动启用。要控制此行为,请使用concurrent_insert.系统变量。看第8.11.3节,“并发插入”.

如果使用锁定表格,你可以要求一个阅读本地锁定而不是阅读锁定以启用其他会话以在锁定表时执行并发插入。

表演许多选择表上的操作t1级当不能同时插入时,可以将行插入到临时表中温度t1并使用临时表中的行更新实际表:

mysql>锁表t1 WRITE,temp\u t1 WRITE;mysql>INSERT INTO t1 SELECT*FROM temp\u t1;mysql>从temp\u t1中删除;mysql>解锁表;

选择锁定类型

通常,表锁在以下情况下优于行级锁:

  • 读取的大多数语句是读取的。

  • 表的语句是读和写的混合,其中写是可以用一个键读取的单个行的更新或删除:

    更新tbl\U名称=价值哪里唯一\u键\u列=关键字值; 从删除tbl\U名称哪里唯一\u键\u列=关键字值;
  • 选择结合并发陈述,而且很少更新删除声明。

  • 多次扫描或分组依据在没有任何写入程序的情况下对整个表执行操作。

使用更高级别的锁,您可以通过支持不同类型的锁来更轻松地调优应用程序,因为锁开销比行级别的锁小。

行级锁定以外的选项:

  • 版本控制(例如MySQL中用于并发插入的版本),其中一个writer可以同时拥有多个reader。这意味着数据库或表支持不同的数据视图,具体取决于访问何时开始。其他常用术语有时间旅行,写作,按需复制。

  • 按需复制在许多情况下优于行级锁定。然而,在最坏的情况下,它可以使用比使用普通锁多得多的内存。

  • 您可以使用应用程序级锁,例如获取\锁定()释放锁()在MySQL中。这些锁是建议锁,因此它们只适用于相互协作的应用程序。看到了吗第12.15节“锁定功能”.