暂无图片
先执行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
Thomas

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

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

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

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

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

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏