insert语句会锁表吗(Oracle中insert到一张表数据,但是不提交,这个时候select,会不会锁表,如果在并发量是500,会锁表吗)

本文目录
- Oracle中insert到一张表数据,但是不提交,这个时候select,会不会锁表,如果在并发量是500,会锁表吗
- MYSQL insert into select 锁表问题
- 直接insert或update也会造成事务死锁吗
- oracle insert 锁表 怎么解决
- oracle insert select会锁表吗
Oracle中insert到一张表数据,但是不提交,这个时候select,会不会锁表,如果在并发量是500,会锁表吗
不会的,如果不是在一个事务中读取出来的数据是Insert之前的。如果在一个事务中,则是Insert之后的情况
MYSQL insert into select 锁表问题
加锁情况与死锁原因分析
为方便大家复现,完整表结构和数据如下:
CREATE TABLE `t3` (
`c1` int(11) NOT NULL AUTO_INCREMENT,
`c2` int(11) DEFAULT NULL,
PRIMARY KEY (`c1`),
UNIQUE KEY `c2` (`c2`)
) ENGINE=InnoDB
insert into t3 values(1,1),(15,15),(20,20);
在 session1 执行 commit 的瞬间,我们会看到 session2、session3 的其中一个报死锁。这个死锁是这样产生的:
1. session1 执行 delete 会在唯一索引 c2 的 c2 = 15 这一记录上加 X lock(也就是在MySQL 内部观测到的:X Lock but not gap);
2. session2 和 session3 在执行 insert 的时候,由于唯一约束检测发生唯一冲突,会加 S Next-Key Lock,即对 (1,15] 这个区间加锁包括间隙,并且被 seesion1 的 X Lock 阻塞,进入等待;
3. session1 在执行 commit 后,会释放 X Lock,session2 和 session3 都获得 S Next-Key Lock;
4. session2 和 session3 继续执行插入操作,这个时候 INSERT INTENTION LOCK(插入意向锁)出现了,并且由于插入意向锁会被 gap 锁阻塞,所以 session2 和 session3 互相等待,造成死锁。
- Prior to inserting the row, a type of gap lock called an insert intention gap lock is set. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap.
1. 它不会阻塞其他任何锁;
2. 它本身仅会被 gap lock 阻塞。
1. 在绝大部分的业务场景下,都可以把 MySQL 的隔离界别设置为 READ-COMMITTED;
2. 在业务方便控制字段值唯一的情况下,尽量减少表中唯一索引的数量。
死锁日志如下:
请点击输入图片描述
INSERT INTENTION LOCK
在之前的死锁分析第四点,如果不分析插入意向锁,也是会造成死锁的,因为插入最终还是要对记录加 X Lock 的,session2 和 session3 还是会互相阻塞互相等待。
但是插入意向锁是客观存在的,我们可以在官方手册中查到,不可忽略:
插入意向锁其实是一种特殊的 gap lock,但是它不会阻塞其他锁。假设存在值为 4 和 7 的索引记录,尝试插入值 5 和 6 的两个事务在获取插入行上的排它锁之前使用插入意向锁锁定间隙,即在(4,7)上加 gap lock,但是这两个事务不会互相冲突等待。
当插入一条记录时,会去检查当前插入位置的下一条记录上是否存在锁对象,如果下一条记录上存在锁对象,就需要判断该锁对象是否锁住了 gap。如果 gap 被锁住了,则插入意向锁与之冲突,进入等待状态(插入意向锁之间并不互斥)。总结一下这把锁的属性:
在学习 MySQL 过程中,一般只有在它被阻塞的时候才能观察到,所以这也是它常常被忽略的原因吧...
GAP LOCK
在此例中,另外一个重要的点就是 gap lock,通常情况下我们说到 gap lock 都只会联想到 REPEATABLE-READ 隔离级别利用其解决幻读。但实际上在 READ-COMMITTED 隔离级别,也会存在 gap lock ,只发生在:唯一约束检查到有唯一冲突的时候,会加 S Next-key Lock,即对记录以及与和上一条记录之间的间隙加共享锁。
通过下面这个例子就能验证:
请点击输入图片描述
这里 session1 插入数据遇到唯一冲突,虽然报错,但是对 (15,20] 加的 S Next-Key Lock 并不会马上释放,所以 session2 被阻塞。另外一种情况就是本文开始的例子,当 session2 插入遇到唯一冲突但是因为被 X Lock 阻塞,并不会立刻报错 “Duplicate key”,但是依然要等待获取 S Next-Key Lock 。
有个困惑很久的疑问:出现唯一冲突需要加 S Next-Key Lock 是事实,但是加锁的意义是什么?还是说是通过 S Next-Key Lock 来实现的唯一约束检查,但是这样意味着在插入没有遇到唯一冲突的时候,这个锁会立刻释放,这不符合二阶段锁原则。这点希望能与大家一起讨论得到好的解释。
如果是在 REPEATABLE-READ,除以上所说的唯一约束冲突外,gap lock 的存在是这样的:
普通索引(非唯一索引)的S/X Lock,都带 gap 属性,会锁住记录以及前1条记录到后1条记录的左闭右开区间,比如有记录,delete 6,则会锁住[4,8)整个区间。
对于 gap lock,相信 DBA 们的心情是一样一样的,所以我的建议是:
锁冲突矩阵
前面我们说的 GAP LOCK 其实是锁的属性,另外我们知道 InnoDB 常规锁模式有:S 和 X,即共享锁和排他锁。锁模式和锁属性是可以随意组合的,组合之后的冲突矩阵如下,这对我们分析死锁很有帮助:
请点击输入图片描述
直接insert或update也会造成事务死锁吗
死锁是操作系统的名词。是指在响应数据库操作时的反应情况。
这个与计算机的配置及环境设置有关。
注意一般的insert不会出问题,因为此语句,只是在数据库的最末写入新纪录。
而update,较之占内存。
oracle insert 锁表 怎么解决
你好,会锁表的,只要是dml语句,都会锁表
dml:
insert
into
update
delete
希望你满意。满意采纳。谢谢
oracle insert select会锁表吗
你好,会锁表的,只要是dml语句,都会锁表
dml: insert into update delete
希望你满意。满意采纳。谢谢

更多文章:
手机老是出现failed(华为手机errconnectfailed)
2025年12月31日 05:30
mathematica10下载(mathematica免费下载地址)
2026年1月12日 23:00
catchphrase的意思(catchphrase是什么意思)
2025年7月19日 18:45
server作主语(英语you must set two server name values怎么翻译)
2026年2月25日 04:00
c语言求最大公约数和最小公倍数辗转相除法(c语言求最大公约数和最小公倍数)
2025年6月24日 13:30
表单大师下载表单大师app下载(眉山市幼儿报名登记表怎么下载下来)
2025年7月1日 03:15
count函数怎么用来统计单元格数量(EXCEL中如何统计此列有数字的单元格个数)
2025年9月23日 17:15
eclipse jdk编译版本(JDK7搭配什么版本的eclipse若是jdk 1.7的话该用Eclipse的哪个版本)
2026年1月15日 13:30
模板制作检验批多少米一张(3000多米的围墙,每100米做一个检验批具体怎么做)
2026年9月17日 02:30
easyuidatagrid 获取选中行数据到详情页(easyui datagrid 怎样获取点击行的数据)
2025年6月21日 20:00
img格式打开(win7电脑如何打开img文件win7系统打开img文件的方法)
2025年9月24日 08:30
befarform是什么意思(be far form中的form什么意思 说详细些)
2025年12月14日 23:15
两函数相加定义域怎么求(两函数相加 定义区怎么求啊拜托了各位 谢谢)
2026年9月20日 15:30












