在日常开发中,经常会写到的一行代码
if (worker != null)
{
_context.ApdFctWorker.Add(worker);
_context.SaveChanges();
}
这种情况,如果有两条线程同时进来,并且他们的主键一样。这条代码就会跳转到catch,在Oracle中,我们可以这样处理,在写入数据的时候,若数据已存在,我们可以认为第二次是更新操作,使用Oracle的merge into命令。
merge into TEST t1 using(select '70749B5274A440A6B4303BF5EB76C7B7' as userid from dual) t2
on (to_char(t1.id) = to_char(t2.userid))
when matched then
update set t1.VALUE = 'test0'
when not matched then
insert (t1.id,t1.value) values ((select sys_guid() from dual),'test')
检查主键为以上的列,在表TEST中是否已存在,若能匹配到,此次操作为更新操作;若未能匹配到,本次操作为定稿操作。