oracle中多个进程可以使用merge into语句对同一个表操作不,能锁表吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中多个进程可以使用merge into语句对同一个表操作不,能锁表吗相关的知识,希望对你有一定的参考价值。

您好,这样的:
会对表加3号锁,会对更新的记录行加6号锁,所以,如果多个进程所更新的不是表中的同一行记录,
不会形成你所理解的锁表(其它进程要等某一进程先提交或回滚)。
Merge不一定锁表,前提要看你怎么写,即使不用merge,在一个大表且没有任何索引的情况下update数据,也有可能锁表:
SET IDENTITY_INSERT TargetTable OFF;
SET NOCOUNT ON

merge TargetTable t
using SourceTable s
on t.ff1=s.ff1
when not matched
then insert values(s.ff2)
--when matched and t.ff2='delete'
--then delete
when matched
then update set t.ff2=s.ff2;
应该怎么改呢,由于是测试,只有主键聚集索引。
我在100万行的数据量下进行了测试,使用update数据的话只有行锁。
参考技术A oracle中多个进程可以使用merge into语句对同一个表操作会引起行级的锁定,但是会引起整个表对象的锁定,只有当所有的执行都完成才会释放。
oracle merge into 的用法详解+实例
作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表;
语法:
MERGE INTO [your table-name] [rename your table here]
USING ( [write your query here] )[rename your query-sql and using just like a table]
ON ([conditional expression here] AND [...]...)
WHEN MATHED THEN [here you can execute some update sql or something else ]
WHEN NOT MATHED THEN
---------------------实例----------------------------------
merge into tfa_alarm_act_nms a
using (select FP0,FP1,FP2,FP3,REDEFINE_SEVERITY
from tfa_alarm_status) b
on (a.fp0=b.fp0 and a.fp1=b.fp1 and a.fp2=b.fp2 and a.fp3=b.fp3)
when matched then update set a.redefine_severity=b.redefine_severity
when not matched then insert (a.fp0,a.fp1,a.fp2,a.fp3,a.org_severity,a.redefine_severity,a.event_time
,a.int_id)
values (b.fp0,b.fp1,b.fp2,b.fp3,b.REDEFINE_SEVERITY,b.redefine_severity,sysdate,7777778);
作用:利用表 tfa_alarm_status跟新表tfa_alarm_act_nms 的b.redefine_severity,条件是a.fp0=b.fp0 and a.fp1=b.fp1 and a.fp2=b.fp2 and a.fp3=b.fp3,如果tfa_alarm_act_nms表中没有该条件的数据就插入。

以上是关于oracle中多个进程可以使用merge into语句对同一个表操作不,能锁表吗的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中merge into的使用

Oracle中merge into的使用 (转)

Oracle中merge into的用法

oracle merge into用法

oracle merge into 表里面的一部分数据怎样做?

Oracle中merge Into的用法