暂无图片
先执行sql语句 A(如果id=1存在,就更新X字段为1,如果不存在就插入),然后不等结果返回(异步执行),立即执行语句B(如果id=1存在,就更新X字段为2,如果不存在,就插入)。 那最后的结果,有没有可能 X 字段是 1 呢?
我来答
分享
暂无图片 匿名用户
先执行sql语句 A(如果id=1存在,就更新X字段为1,如果不存在就插入),然后不等结果返回(异步执行),立即执行语句B(如果id=1存在,就更新X字段为2,如果不存在,就插入)。 那最后的结果,有没有可能 X 字段是 1 呢?

先执行sql语句 A(如果id=1存在,就更新X字段为1,如果不存在就插入),然后不等结果返回(异步执行),立即执行语句B(如果id=1存在,就更新X字段为2,如果不存在,就插入)。
那最后的结果,有没有可能 X 字段是 1 呢?

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
chengang

我们假设 ID为唯一键。

如果存在 就很简单

那么X字段应该为2 (虽然语句B要等A执行完,但最终X字段还是为2)


如果不存在 就复杂一些了

执行语句A的时候,肯定会执行插入

但执行语句B的时候。如果A已插入成功, 那么也会更新为2。如果A未成功。 则会报插入主键冲突错误。


 

暂无图片 评论
暂无图片 有用 0
打赏 0
Thomas

接着aisql的回答说,最后一句:如果A未成功。 则会报插入主键冲突错误。 好像应该是:如果A未成功。 B的插入会被HANG住而不是报主键冲突。因为既然A未成功,说明A的插入并没有提交,这时B要插入同样ID=1的记录,会被HANG住的,可能是ORACLE根据主键约束,在A插入但未提交的记录上加了锁吧。

暂无图片 评论
暂无图片 有用 0
打赏 0
chengang

我写的那个未成功。有歧义。我是指当if exists()时A未成功。但insert 时A成功了。所以会报主键错误。

暂无图片 评论
暂无图片 有用 0
打赏 0
DarkAthena

如果id是唯一键,那么在修改或者插入这行的时候,不管有没有执行完,都会把这行锁起来,另一个会话想插入或者修改都是等待的,直到第一个会话commit。这个时候引入到第二个问题,where 条件 是否会检索未commit的数据?答案是不会。也就是说,只要会话A没提交,那么会话B的where就找不到这笔数据,按照题目来说,此时执行insert,是会被会话A锁的,等会话Acommit,会话B马上报错,提示违反唯一约束。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
temp 临时表空间运行查询sql 不准 ?
回答 1
已采纳
查询temp表空间使用率:selectdf.tablespacename"Tablespace",df.totalspace"Total(MB)",nvl(FS.UsedSpace,0)"Used(M
为什么学了SQL还要学ETL呢?
回答 2
已采纳
这两者根本就不能放在一起比较,因为这两者是描述的不同的东西。ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程结构化查询语言(StructuredQueryLanguage)简称SQL
比较长的sql,格式如: select distinct * from (select 1000+个字段的子查询),该sql在一个服务器上运行正常,在另外一个服务器运行时报:too many columns,如果去掉distinct又可以正常运行。
回答 2
很大可能性是你oracle数据库的版本不同
怎么获取SQL数据库的插入数据的自增ID?
回答 2
已采纳
没理解你的意思。没说数据库l类型。是要获得最大的id吗? 可以selectmax(id)fromt
SQL 求助,如下sql怎么改写可以快起来,Oracle 12
回答 7
是统计8h之内结束的相关数据,如果没有下一次开始时间取sysdate。既然是统计8h内结束的操作,那么没有下一次的取sysdate,不合适啊。没有下一次的就是没结束。为何也要输出?
查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。(any的用法)
回答 1
selectfromscorewherecno&x27;3105&x27;andsco>(selectmin(sco)fromscorewherecno&x27;3245&x27;)orderb
createdb: could not connect to database template1: 致命错误: 角色 "xxx" 不存在
回答 5
已采纳
这是因为在你init之后,pgsql给你创建了一个用户:postgres需要使用$supostgres$createdbmydb然后在运行上面的语句即可以啦
不支持insert into select from dual
回答 1
参数tgclusterusenewdual控制gcluster是否使用dual表的新的实现方式,新的实现方式支持insertinto…select…fromdual等功能。取值范围:0,1默认值00:
同一SQL语句,某日执行耗时43000秒。终止后,再次执行120秒完成。
回答 5
已采纳
可能是由于之前有其他锁的因素导致,比如其他事务未提交,或者数据库在进行备份等因素导致未能按照真实情况执行。
ORACLE 一道SQL题
回答 5
DarkAthena,试了你的SQL,似乎在listagg后要加winthingroup(orderby...)才行吧:withtas(select'(DESCRIPTION(ADDRESSLIST(