万字总结:InnoDB锁类型及其详细分析

5、InnoDB的七种锁 临键锁,是记录锁与间隙锁的组合,既包含索引记录,又包含索引区间。更具体的,临键锁会封锁索引记录本身,以及索引记录之前的区间。插入意向锁,是间隙锁(Gap Locks)的一种(也是实施在索引上的),它是专门针对insert操作的。间隙锁,它封锁索引记录中的间隔,或者第一条索引记录之前的范围,又或者最后一条索引记录之后的范围。,MVCC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读。它会在id=1的索引记录上加锁,以阻止其他事务插入,更新,删除id=1的这一行。 阅读详情

0 事务支持

首先回顾一下事务相关的基础概念。

在默认情况下,InnoDB 开启自动提交,每一个 SQL 语句会形成其独立的事务,在语句执行完毕后自动提交,如果语句执行失败,则自动回滚。用户可以通过 START TRANSACTION 或 BEGIN 命令显式开启事务,通过 COMMIT 或 ROLLBACK 显示提交或回滚事务。用户可以通过 SET AUTO_COMMIT=0 显式关闭自动提交。

隔离级别方面,InnoDB 支持标准的: READ UNCOMMITTED , READ COMMITED , REPEATABLE READ 和 SERIALIZABLE 四种隔离级别。默认情况下,InnoDB 隔离级别设置为 REPEATABLE READ ,可以通过变量 tx_isolation 设置期望的事务隔离级别。

InnoDB 通过不同类型的锁来实现对事务隔离性、一致性的保证,同时提供尽可能高的性能。

为了方便下面讨论,我们建如下表,并进行数据初始化:

CREATE TABLE `tb_test` (
  `id` INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  `value` INT NOT NULL,
  `cnt` INT NOT NULL,
  KEY idx_cnt(`cnt`)
)ENGINE=INNODB;


INSERT INTO `tb_test` VALUES(1, 1, 1), (5, 5, 5), (10, 10, 10), (15, 15, 15), (20, 20, 20);

复制代码

后续讨论均以如上数据结构及初始数据为假设进行讨论。

1 锁的类型及兼容性

1.1 表级锁

MySQL 在引擎之上支持表级别的锁,在数据备份、数据同步等场景下,可以通过表级锁确保获得完整一致的数据。

  • 锁定表读
LOCK TABLE tb_test READ;

复制代码

锁定表读时,不影响其他查询,但阻塞其他数据更新类操作。

  • 锁定写表
LOCK TABLE tb_test WRITE;

复制代码

锁定表写,阻塞所有其他在当前表上的读写操作。

1.2 行级锁

InnoDB 为了尽可能支持高并发的写入,支持细粒度的行级锁。行级锁分为如下几种:

  • 共享(S)锁(Shared Lock):表示锁定一行数据并读取。
  • 排它(X)锁(Exclusive Lock): 表示锁定一行数据更新或删除。

行级锁的兼容关系如下:

可以看到,只有共享锁之间兼容,其他组合之间都是冲突的。

1.3 意向锁

考虑如下场景:

Session A: 申请表 T 的某一行 R 上的 X 锁成功。
Session B: 申请表 T 上的 X 锁,由于与 SessionA 的锁定对象不同,也成功。

这时,Session B 可以在表 T 上进行任意数据的读写,因此也可以对行 R 进行修改,这与 Session A 获取到的 X 锁是冲突的。为了解决这种问题,InnoDB 在行级锁之上支持 表级别的意向锁 (Intention Lock)。

  • 意向共享(IS)锁(Intention Shared lock): 表示事务期望对表 T 上某些行获取共享锁。
  • 意向排他(IX)锁(Intention Exclusive lock):表示事务期望对表 T 上某些行获取排他锁。

例如: SELECT ... LOCK IN SHARE MODE 会在表上设置 IS 锁,而 SELECT ... FOR UPDATE 会在表上设置 IX 锁。

意向锁遵循如下原则:

  • 在某事务获取 S 锁之前,需要首先获取对应表上的 IS 或者更强的 IX 锁。
  • 在某事务获取 X 锁之前,需要首先获取对应表上是 IX 锁。

兼容性方面:

  • 意向锁之间是完全兼容的。这是因为意向锁是为了处理表锁和行锁之间可能存在的并发冲突而引入的,意向锁获取的上下文中,实际期望操作的是表中的某些行,两个事务可能操作的是完全不同的行,因此意向锁之间没有互相阻塞的需要。
  • 意向锁是表级锁,因此与行锁之间是完全兼容的,不存在互相冲突。
  • 意向锁和表级锁之间的兼容性,可以将意向锁视作同等级别的表锁进行分析。即:IX 锁与表级 X, S 锁都是冲突的,IS 锁与表级 X 锁冲突、与表级 S 锁兼容。

1.4 行锁、间隙锁及 Next-Key Lock

如前面讨论,InnoDB 支持行级锁。行级锁主要包括行锁、间隙锁以及 Next-Key lock

1.4.1 行锁

从名称看来,行锁锁定的对象是表中的记录行。 但事实上,行锁锁定的对象是索引记录 。通常 InnoDB 表都会建立索引,即使不显式建立索引,InnoDB 也会为表创建索引。

对两个会话,执行如下命令:

此时查询锁的情况:

mysql> select * from innodb_lock_waits;
+-------------------+-------------------+-----------------+------------------+
| requesting_trx_id | requested_lock_id | blocking_trx_id | blocking_lock_id |
+-------------------+-------------------+-----------------+------------------+
| 15389             | 15389:23:3:2      | 15388           | 15388:23:3:2     |
+-------------------+-------------------+-----------------+------------------+
1 row in set (0.01 sec)


# 为了便于展示,部分信息省略
mysql> select * from innodb_locks;
+--------------+-------------+-----------+-----------+------------------+------------+
| lock_id      | lock_trx_id | lock_mode | lock_type | lock_table       | lock_index |
+--------------+-------------+-----------+-----------+------------------+------------+
| 15389:23:3:2 | 15389       | X         | RECORD    | `test`.`tb_test` | PRIMARY    |
| 15388:23:3:2 | 15388       | S         | RECORD    | `test`.`tb_test` | PRIMARY    |
+--------------+-------------+-----------+-----------+------------------+------------+
2 rows in set (0.00 sec)

复制代码

可以看到会话 A 持有 S 锁,而此时会话 B 申请 X 锁被会话 A 阻塞。注意此时 lock_type 是 RECORD , lock_index 是 PRIMARY ,表明两个锁的类型是行锁,而这个行锁的锁定对象是表的主键记录。此时执行命令 SHOW ENGINE INNODB STATUS ,可以看到如下结果,注意字样: X locks rec but not gap ,表明不是间隙锁。

RECORD LOCKS space id 23 page no 3 n bits 72 index `PRIMARY` of table `test`.`tb_test` trx id 15387 lock_mode X locks rec but not gap waiting

复制代码

1.4.2 间隙锁 (Gap Lock)与幻读

考虑下面的场景

此时查看锁的情况如下:

可以看到,这个场景中,两个会话都获取了间隙锁。session A 获取了 X 型的 Gap Lock, lock_type 为 RECORD. sessionB 在插入数据时,期望获取同样的 X 锁,被 session A 阻塞。

那么,什么是间隙锁呢?

间隙锁是指:在扫描数据时,对于满足条件的数据,锁定索引记录之间区间,或者第一个索引记录之前的区间,或者最后一个索引记录之后的区间。例如,对于表 tb_test 中的数据:

<code data-type="codeline">MySQL [gaea]> select * from tb_test;</code><code data-type="codeline">+----+-------+-----+</code><code data-type="codeline">| id | value | cnt |</code><code data-type="codeline">+----+-------+-----+</code><code data-type="codeline">|  1 |     1 |   1 |</code><code data-type="codeline">|  5 |     5 |   5 |</code><code data-type="codeline">| 10 |    10 |  10 |</code><code data-type="codeline">| 15 |    15 |  15 |</code><code data-type="codeline">| 20 |    20 |  20 |</code><code data-type="codeline">+----+-------+-----+</code>

复制代码

针对主键 id , 则应该有如下间隙, 注意他们都是开区间 :

(-∞,1), (1,5), (5,10), (10,15), (15,20), (20,∞)

复制代码

前面的例子中,session A 和 session B 所操作的数据都位于区间 (5, 10) 而观察此时 lock_data 列,值为 10。即间隙 (5, 10) 与索引记录 10 相关联。因此, 间隙锁位于行锁对应的索引记录之前,到前一个索引之间的区间。

那么,为什么需要间隙锁呢?

考虑如下场景:

此场景下,session B 的插入操作会被 session A 第一条 SELECT ... FOR UPDATE 语句阻塞,因为 session B 期望插入的记录,位于 session A 锁定的区间内。

此时,如果没有间隙锁,session A 第二次查询将查到第一次查询结果中不存在的记录,即出现了所谓的 幻读 。 因而,间隙锁的存在,主要是为了解决幻读的问题。

在 MySQL InnoDB 的事务模型中,幻读存在的条件是,事务的隔离级别低于 REPEATABLE READ 。

因此,只有将数据库的隔离级别设置为等于或者高于 REPEATABLE READ ,上述场景才会出现会话之间阻塞的情况。如果将隔离级别设置为 READ COMMITED ,则不会出现相应的阻塞,因为在此时的隔离级别下,容忍幻读的存在。

继续考虑如下场景:

按照前面的讨论,两个会话都会获取 (5,10) 之间的间隙锁,那么 session B 是否会被 session A 阻塞?实际情况是并不会阻塞,这是因为: 间隙锁之间并不会相互阻塞,无论锁的类型是 X 还是 S,间隙锁的目的是为了阻止其他会话插入对应的区间,因此也仅会阻塞其他会话的插入操作。

1.4.3 Next-Key lock

考虑如下场景:

此时查询锁的情况如下:

此时,虽然 session A 中的查询,符合条件的记录仅有 (10, 10, 10) 一条,但是,session A 仍旧阻塞了 session B。

上面的场景中: 行锁和间隙锁共同构成了 Next-Key lock. InnoDB 在进行加锁时,会对扫描到的索引加 Next-Key lock,即同时加行锁和间隙锁。 例如,对于插入的记录 (6,6,6) ,对应主键 10,其对应的 Next-Key lock 为: (5,10] 。

1.4.4 Next-Key Lock 的退化

与上面的场景类似,考虑如下场景:

注意到,与上一个例子的不同之处是,此场景下,session A 的查询条件为 id。此时,session B 并不会被阻塞,这是否与前面的讨论矛盾呢?

事实上这是索引记录的加锁的特殊情况: 对于索引上的等值查询,如果是唯一索引,且扫描到对应的索引记录,则 Next-Key lock 退化为行锁。

继续考虑如下场景:

按照前面的描述,此时 session A 应该在 tb_test 表的 idx_cnt 索引上加 Next-Key lock,即 (15,20] 。但是,观察到,此时 session B 会被阻塞,而 session C 的语句可以执行成功。查看锁的情况:

这种场景下: 对于索引上的等值查询,扫描到的最后一个索引记录不符合条件,Next-Key lock 退化为间隙锁。

1.4.5 插入意向锁(Insert Intention Lock)

对于前面讨论的场景:

session B 会被 session A 阻塞,此时通过执行命令 SHOW ENGINE INNODB STATUS 可以观察到:

<code data-type="codeline">------- TRX HAS BEEN WAITING 10 SEC FOR THIS LOCK TO BE GRANTED:</code><code data-type="codeline">RECORD LOCKS space id 23 page no 3 n bits 80 index PRIMARY of table `gaea`.`tb_test` trx id 1372 lock_mode X locks gap before rec insert intention waiting</code><code data-type="codeline">Record lock, heap no 4 PHYSICAL RECORD: n_fields 5; compact format; info bits 0</code><code data-type="codeline"> 0: len 4; hex 0000000a; asc     ;;</code><code data-type="codeline"> 1: len 6; hex 000000000507; asc       ;;</code><code data-type="codeline"> 2: len 7; hex a70000011b0128; asc       (;;</code><code data-type="codeline"> 3: len 4; hex 8000000a; asc     ;;</code><code data-type="codeline"> 4: len 4; hex 8000000a; asc     ;;</code>

复制代码

注意到此时插入操作被阻塞期间,等待的锁为插入意向锁 insert intention 。 插入意向锁实际就是插入操作在进行插入之前获取的一种特殊的间隙锁。

前面讨论的间隙锁的规则,也适用于插入意向锁,即: 插入意向锁之间不会互相阻塞,但插入意向锁与重叠区间的其他间隙锁之间会互相阻塞,这是因为间隙锁的主要目的就是避免在事务未提交前,其他事务在区间内插入新的记录。

1.4.6 小结

综合上面对行级锁的讨论,进行小结:

  • InnoDB 行级锁加锁的基本单位是 Next-Key lock.
  • 加锁的对象为语句执行过程中的索引记录。
  • 对于索引上的等值查询,如果是唯一索引,且扫描到对应的索引记录,则 Next-Key lock 退化为行锁。
  • 对于索引上的等值查询,扫描到的最后一个索引记录不符合条件,Next-Key lock 退化为间隙锁。
  • 间隙锁之间不会相互阻塞,其目的主要为避免并发的其他会话在区间内插入新的记录。
  • 插入意向锁是 INSERT 操作获取的一种特殊间隙锁,插入意向锁之间不会相互阻塞,但与其他间隙锁之间会相互阻塞。

2 不同语句锁类型

2.1 锁定读、UPDATE 及 DELETE

对于锁定读( SELECT ... LOCK IN SHARE MODED / SELECT ... FOR UPDATE )以及 UPDATE 、 DELETE 操作,InnoDB 会在所有扫描到的索引记录上添加行级锁。需要注意的是添加行级锁的范围与 WHERE 条件没有关系。

如前面讨论的,这里的行级锁通常为 Next-Key lock,只有在索引等值查询的时候会退化。因此,应该对表的索引进行仔细设计,同时注意语句的执行计划,避免锁定大范围的数据。

假设某些语句不走索引,那么 InnoDB 将不得不进行全表扫描,这将导致所有记录及其之间的间隙锁定。此时将不能在表中插入记录。例如,如下的查询,虽然是等值查询,但是其执行计划为全表扫描,其他并发的插入将均被阻塞。

mysql> explain select * from tb_test where value=7 for update;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | tb_test | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    5 |    20.00 | Using where |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+

复制代码

2.2 INSERT

如前面讨论, INSERT 首先会获取插入意向锁,这是一种区间锁,如果对应区间已经被锁定,那么 INSERT 操作将无法继续执行。如果获取插入意向锁成功,那么 INSERT 将继续执行,同时会获取插入记录上的行锁。

插入过程中,如果发生索引冲突 DUPLICATE KEY ERROR ,此时插入操作将会获取对应索引记录上共享锁。这有可能导致死锁的发生。考虑如下场景。

session A 首先获取主键记录 1 上的排他锁,接下来 session B 和 session C 的插入操作都会得到主键冲突,因此会各自获取主键记录上的共享锁。然后 session A 回滚,此时 session B 和 session C 都尝试获取排他锁,但是被对方的共享锁阻塞,从而发生死锁。

2.3 复杂语句

与 INSERT 不同, INSERT ... ON DUPLICATE KEY UPDATE ... 在出现主键冲突需要执行更新操作时,会获取排他锁。当扫描的记录是主键时,Next-Key lock 退化为行锁。

INSERT INTO T SELECT ... FROM S WHERE... 语句会在表 T 上针对插入的每行获取行锁,此时并不会获取间隙锁。在表 S 上,会对扫描到的记录获取 Next-Key lock。

3 死锁

3.1 概念及示例

数据库中的死锁与一般意义上的死锁并没有区别,出现的条件可以简要描述为:

两个独立的过程(线程、事务等)在执行过程中,获取锁时出现了闭环的循环等待。

考察如下产生死锁的场景:

分析上述会话,session A 第一条 delete 语句,会获取 Next-Key lock,由于查询条件 id 是唯一索引,因此会退化为间隙锁(表中并不存在对应的记录,不会退化为行锁): (5, 10) ; 同样地,session B 的 delete 语句也会获取间隙锁。

由于间隙锁之间不会冲突,因此两个会话的 delete 语句都成功获取锁。接下来,session A 执行插入操作,获取插入意向锁,被 session B 获取的间隙锁阻塞,接着 session B 同样执行插入操作,被 session A 阻塞。此时产生死锁,某一个会话的事务被回滚。另一个会话的插入操作则执行成功。

3.2 死锁应对

在支持事务的数据库中,死锁是一个常见的问题。死锁问题并不是绝对不能发生的危险问题,只要不因频繁发生死锁而大面积影响业务,对小概率发生死锁的情况,进行提前设计可以有效应对。

  • 仔细设计 SQL,避免间隙锁加在较大的区间。较大的区间意味着更高的并发写入概率,从而会提高死锁发生的概率。

例如,对于 2.1 中所举的例子,将 SQL 改写为 INSERT INTO ... ON DUPLICATE KEY UPDATE... . 如果没有对应的数据,不同行的插入,插入意向锁不会相互阻塞;如果有重复主键数据,则 UPDATE 操作属于唯一索引上的等值查询,此时间隙锁退化为行锁。

  • 优化业务流程,降低事务的总执行时间。通过降低事务的执行时间,降低了事务之间并发的可能性,从而一定程度上降低死锁发生的概率。

例如,在设计数据结构和业务流程时,避免在一个长事务中操作多张表。

又例如,避免在事务当中引入其他网络调用操作,因为网络调用的时间通常会远高于本地调用。

  • 如果可能,适当降低隔离级别。InnoDB 默认隔离级别为 REPEATABLE READ ,在某些高查询低写入、业务流程相对简单或者容忍幻读的应用场景中,可以将隔离级别设置为 READ COMMITTED ,这不但能够在一定程度上降低死锁发生的概率,还能有效提升数据库能够提供的并发能力。

例如,对于 2.1 中所举的例子,将数据库的隔离级别设置为 READ COMMITTED 则不会发生死锁。

  • 对于 SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE ,如果查询读取的记录为单行,也可以降低事务隔离级别至 READ COMMITTED 。此时已通过命令显式加锁,无需更高的隔离级别。

对于上面两条建议,需要注意:

当将隔离级别设置为 READ COMMITTED 时,意味着容忍幻读的发生,此时间隙锁不生效,并发会话可能插入并不存在的数据,导致前后读取的记录数不一致。

  • 仔细设计表的索引。通过良好设计的索引降低事务扫描的记录数,从而降低死锁的概率。
  • 对于可能发生的死锁,还需要设计重试机制。万一产生死锁,通过重试机制确保数据可以最终写入成功。
Dify 部署与使用 本文介绍了Dify社区版的快速部署指南,涵盖系统架构、环境配置和初始化流程。Dify采用微服务架构,通过Docker Compose一键部署8个核心容器,包括前端、后端、数据库等组件。部署过程包括克隆代码、配置环境变量和启动服务,首次启动需3-10分钟下载镜像。文章详细讲解了.env文件的配置要点,包括服务地址、数据库连接和向量存储设置,并提供了生产环境安全加固建议。最后通过访问/install页面完成管理员账号初始化,即可开始使用Dify构建AI应用。 阅读详情

相关推荐

《uni-app 长列表优化:虚拟列表(vue-virtual-scroller)解决 1000+ 数据渲染卡顿》(附虚拟列表封装与多端适配)

本文详细介绍了虚拟列表技术在前端长列表渲染中的优化方案。针对传统v-for渲染导致的性能问题(内存占用高、渲染阻塞、滚动卡顿),提出基于vue-virtual-scroller的虚拟列表解决方案,通过可视区域渲染和DOM复用实现性能突破。文章包含核心原理、组件封装、多端适配及性能对比,并给出常见问题的解决方法。实践表明,该方案可将1000条数据的首次渲染时间从3800ms降至420ms,滚动FPS提升至55帧,显著改善用户体验。

qq_59041750的博客 2109

阿里大神万字总结:InnoDB锁类型及其详细分析(仅此一篇,干货建议收藏!!)

0 事务支持 首先回顾一下事务相关的基础概念。 在默认情况下,InnoDB 开启自动提交,每一个 SQL 语句会形成其独立的事务,在语句执行完毕后自动提交,如果语句执行失败,则自动回滚。用户可以通过 START TRANSACTION 或 BEGIN 命令显式开启事务,通过 COMMIT 或 ROLLBACK 显示提交或回滚事务。用户可以通过 SET AUTO_COMMIT=0 显式关闭自动提交。 隔离级别方面,InnoDB 支持标准的: READ UNCOMMITTED , READ COMMITED ,

程序员干货站 775

大众点评爬虫实战:如何用Python绕过反爬机制获取评论数据(附完整代码)

本文深入探讨了2024年使用Python进行大众点评数据采集的实战策略。文章详细解析了现代反爬机制的核心逻辑,并提供了从构建拟人化请求会话、应对动态内容与接口加密,到工程化实践(代理调度、状态持久化)的完整解决方案与代码示例,旨在帮助数据分析师稳健获取评论数据,用于后续的文本挖掘与商业洞察。

weixin_29084111的博客 1921

mysql中innodb引擎的锁问题

一,概述     相对其他数据库而言,mysql的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如:myisam和memory存储引擎采用的是表级锁,bdb采用的是页面锁,但也支持表级锁,innodb存储引擎即支持行级锁也支持表级锁,但默认情况下是行级锁。   三种锁的特性大致归纳如下:     (1)表级锁:开销小,加锁快;不会出现死锁;锁粒度大,发生冲突的概率高,并发

fuzhongyu2的博客 2338

MATLAB实战:用ARMAX模型搞定电力系统惯量评估(附完整代码)

本文详细介绍了如何利用MATLAB中的ARMAX模型进行电力系统惯量评估,解决新能源占比提高带来的系统惯量下降问题。通过系统辨识技术,从电网运行数据中准确提取惯量参数,并提供完整的代码实现,帮助工程师快速应用于实际工程。

peach的博客 638

LangFuse部署与实践

LangFuse的原理主要是基于可观察性和分析技术来监控和优化低延迟消息(LLM)应用。它提供了一套完整的解决方案,通过收集、处理和分析LLM应用在运行过程中产生的各种数据,来生成实时的、深入的、可操作的见解。通过提供实时的、深入的见解和可视化的跟踪功能,LangFuse使得识别和解决应用性能问题变得更加简单和高效。总的来说,LangFuse的原理是通过综合运用可观察性和分析技术,来提供对LLM应用的全面监控和优化能力。这使得开发者和运维团队能够更加高效地管理和维护他们的应用,从而提升用户体验和业务效益。

pumpkin84514的博客 7948

MySQL InnoDB下的锁问题

InnoDB的行锁是基于索引实现的,如果不通过索引加锁访问数据,InnoDB会对所有数据加锁。在不同隔离级别下,InnoDB的锁机制和一致性读取策略不通。介绍了Next-Key锁机制,以及InnoDB使用Next-Key锁的原因。精心设计索引,并尽量使用索引访问数据,使加锁的粒度更小,从而减少锁冲突的机会。选择合理的事务,小事务发生死锁的概率小。尽量使用相等的条件访问数据,避免Next-Key锁对并发插入的影响。避免死锁的一些常用方法对于一些特定的事务,可以利用表锁来提高处理速度。

m88997766的博客 227

数据库小技能:数据导入脚本

背景:版本大升级,从2.0升级到3.0 ,服务端开发语言从c#换到java语言。数据库类型从microsalft sql server 换到mysql。数据来源于微信,用于查询卡bin。

专注于计算机研发知识和资讯分享 774

MySQL——InnoDB锁问题(二)

可以通过show status like 'innodb_row_lock%';查看系统上的行锁争用情况;

追梦人的博客 624

<PLC><西门子><工控>西门子博图V18中使用SCL语言编写一个CRC16-modbus校验程序

西门子官方对于SCL语言的介绍如下:SCL 编程语言SCL 编程语言SCL(Structured Control Language,结构化控制语言)是一种基于 PASCAL 的高级编程语言。这种语言基于标准DIN EN 61131-3(国际标准为 IEC 1131-3)。根据该标准,可对用于可编程逻辑控制器的编程语言进行标准化。SCL 编程语言实现了该标准中定义的 ST 语言 (结构化文本) 的PLCopen 初级水平。语言元素。

用沸腾的热血,支付我们的人生吧! 1439

论文阅读:Universal and Transferable Adversarial Attacks on Aligned Language Models. LLM Attacks

因为“即开即用”的大型语言模型能够生成大量令人反感的内容,近期的工作集中在对这些模型进行对齐,以防止不受欢迎的生成。尽管在规避这些措施方面取得了一些成功——即所谓的针对大型语言模型(LLMs)的“越狱”——这些攻击需要大量的人类智慧,并且在实践中很脆弱。自动对抗性提示生成的尝试也取得了有限的成功。在本文中,我们提出了一种简单有效的攻击方法,可以导致对齐的语言模型生成令人反感的行为。

CSPhD-winston的博客 1418

InnoDB的七种锁介绍

共享/排他锁 InnoDB实现了两种标准的行级锁:共享锁(简称S锁)、排他锁(简称X锁)。 共享锁:简称为S锁,在事务要读取一条记录时,需要先获取该记录的S锁。 排他锁:简称X锁,在事务需要改动一条记录时,需要先获取该记录的X锁。 ...

我的java进阶之路 2229

【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红

文章目录1.概述M.参考 1.概述 因为内网开发,然后这几天我被隔离了,然后公司搞了一个外网的vpn能连接的云桌面,云桌面也是网络隔离的,因此只能自己拷贝相关的文件到里面。 然后我就拷贝了代码和maven仓库中的一部分,因为本地的20G一次拷贝不完,需要多次拷贝,但是我拷贝了kafka,仍然飘红。具体如下 idea左侧External Libraries里,没有Maven的依赖包 然后整了很久都没搞定,后来我自己新建了一个项目,然后引入发现是不可以的,而且框框里面的飘红。 然后我就想是不是因为缺少依赖

九师兄 4412

大神万字总结:InnoDB 锁类型及其详细分析

0 事务支持 首先回顾一下事务相关的基础概念。 在默认情况下,InnoDB 开启自动提交,每一个 SQL 语句会形成其独立的事务,在语句执行完毕后自动提交,如果语句执行失败,则自动回滚。用户可以通过START TRANSACTION或BEGIN命令显式开启事务,通过COMMIT或ROLLBACK显示提交或回滚事务。用户可以通过SET AUTO_COMMIT=0显式关闭自动提交。 隔离级别方面,InnoDB 支持标准的:READ UNCOMMITTED,READ COMMITE...

qq_42986622的博客 352

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

大神万字总结:InnoDB 锁类型及其详细分析,nginx面试题汇总

另一个会话的插入操作则执行成功。例如,如下的查询,虽然是等值查询,但是其执行计划为全表扫描,其他并发的插入将均被阻塞。这是因为意向锁是为了处理表锁和行锁之间可能存在的并发冲突而引入的,意向锁获取的上下文中,实际期望操作的是表中的某些行,两个事务可能操作的是完全不同的行,因此意向锁之间没有互相阻塞的需要。前面讨论的间隙锁的规则,也适用于插入意向锁,即: 插入意向锁之间不会互相阻塞,但插入意向锁与重叠区间的其他间隙锁之间会互相阻塞,这是因为间隙锁的主要目的就是避免在事务未提交前,其他事务在区间内插入新的记录。

2401_87557072的博客 798

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

阿里大神万字总结:InnoDB锁类型及其详细分析(仅此一篇,干货建议收藏!!

如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了InnoDB 为了尽可能支持高并发的写入,支持细粒度的行级锁。行级锁分为如下几种:共享(S)锁(Shared Lock):表示锁定一行数据并读取。排它(X)锁(Exclusive Lock): 表示锁定一行数据更新或删除。行级锁的兼容关系如下:可以看到,只有共享锁之间兼容,其他组合之间都是冲突的。

2301_82242082的博客 1192

InnoDB锁类型及其详细分析

2021-05-24 20:09·马士兵老师首先回顾一下事务相关的基础概念。在默认情况下,InnoDB 开启自动提交,每一个 SQL 语句会形成其独立的事务,在语句执行完毕后自动提交,如果语句执行失败,则自动回滚。用户可以通过 START TRANSACTION 或 BEGIN 命令显式开启事务,通过 COMMIT 或 ROLLBACK 显示提交或回滚事务。用户可以通过 SET AUTO_COMMIT=0 显式关闭自动提交。隔离级别方面,InnoDB 支持标准的: READ UNCOMMITTED , RE

weixin_53953440的博客 199

08-MySQL InnoDB锁的基本类型

MyISAM只支持表锁,而InnoDB同时支持表锁和行锁。表锁和行锁的区别到底在哪里?锁定粒度:表锁 > 行锁加锁效率:表锁 > 行锁冲突概率:表锁 > 行锁并发性能: 表锁 < 行锁表锁锁粒度大,加锁快,锁的并发性能低,而行锁锁粒度小,加锁慢,锁的并发性能高。

Bonnie_1215的博客 1437

InnoDB锁类型和使用

InnoDB锁类型 InnoDB引擎使用了八种类型的锁,他们分别是: 共享排他锁(Shared and Exclusive Locks) 意向锁(Intention Locks) 记录锁(Record Locks) 间隙锁(Gap Locks) 临键锁 (Next-Key Locks) 插入意图锁(Insert Intention Locks) 自增锁(AUTO-INC Locks) 空间锁和预测锁(Predicate Locks for Spatial Indexes) 共享排他锁(Shared an

说不如做 757

两万字图文详解!InnoDB锁专题!

InnoDB 呢实现了两种标准的行级锁:共享锁(简称 S 锁)、排他锁(简称 X 锁)。共享锁:简称为 S 锁,在事务要读取一条记录时,需要先获取该记录的 S 锁。排他锁:简称 X 锁,在事务需要改动一条记录时,需要先获取该记录的 X 锁。如果事务T1持有行 R 的S锁,那么另一个事务T2请求访问这条记录时,会做如下处理:T2 请求S锁立即被允许,结果T1和T2都持有 R 行的S锁T2 请求X锁不能被立即允许, 此操作会阻塞如果T1持有行 R 的X锁,那么T2请求 R 的X、S锁都不能被立即允许,

LoveSummer 4900

InnoDB Locking——锁类型简介

主要翻译文档 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html 针对部分理论知识自己做了测试。 InnoDB锁类型主要包含以下几种 Shared and Exclusive Locks ,即我们常说的共享锁和独占锁 Intention Locks,意向锁 Record Locks,行锁 Gap Locks,GAP锁 Next...

Mergades 1007

MySQL-InnoDB常用锁类型解析

Shared(乐观锁) and Exclusive Locks(互斥锁):         InnoDB有两种锁类型,Shared(s) and Exclusive(x) Locks(乐观锁和互斥锁)。         Shared(s)Locks:允许持有该锁的事务读取数据;         Exclusive(x) Locks:允许持有锁的事务插入,更新或修改数据; 如果事务T1在r记...

茹煜得氺的博客 8607

innoDB的锁的类型及加锁方法

首先要明白,innoDB支持多粒度锁,即允许行锁和表锁共存 共享锁(shared lock)(读锁,S锁): S锁分为行级S锁和表级S锁。不同的事务可以同时获得同一个S锁(即不同事务可以共享S锁),比如不同事务可以同时获取某表的某行的S锁。某表或某行被S锁锁定后,就不能被X锁锁定(即S锁和X锁是互斥的); 排他锁(exclusive lock)(写锁,X锁): X锁分为行级X锁和表级X锁。X锁与其它一切锁都是互斥的(这就是"排他"的含义),比如某表的某行被X锁锁定后,既不能被其它事务的S锁锁定,也不能被其它

qq_33987908的博客 1210

InnoDB锁的类型

在一个高并发系统中,会出现多会话同时访问同一资源的情况,此时即产生了竞争。为了保证数据的一致性,必须要用锁机制来控制资源的并发访问。 InnoDB采用的行锁的设计(MyISAM只支持表锁),行锁带来更高的并发性,但管理复杂度也要比表锁更高。InnoDB共实现了2种标准的行级锁: 共享锁(S Lock),允许持有锁的事务读取数据。 排他锁(X Lock),允许持有锁的事务修改和删除数据。 其中仅S锁和S锁兼容,X锁与任何锁都不兼容。 意向锁(Intention locks): InnoDB存储引..

最简单的方法,解决最实际的问题。 1112

Innodb锁的类型

Innodb锁的类型 首先知道的一些点 共享/排它锁 意向锁 记录锁 间隙锁 临键锁 插入意向锁 自增锁 ps Innodb锁的类型 共享/排它锁(Shared and Exclusive Locks) 意向锁(Intention Locks) 记录锁(Record Locks) 间隙锁(Gap Locks) 临键锁(Next-key Locks) 插...

Aaron_涛 850
上一篇: Spring安全的角色和权限源码与教程
下一篇: Java中12个原子(Atomic)操作类实现原理分析
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值