在资源繁忙的情况下,oracle表中的字段更新为null

在资源繁忙的情况下,oracle表中的字段更新为null,oracle,plsql,oracle10g,Oracle,Plsql,Oracle10g,这是一个负面案例 这是我的plsql代码的伪代码 SELECT marks into v_marks from table_a; SELECT ROLLNO into v_rollno from table_b; Update table_a set marks = marks- var1 where id=1; commit; 此plsql代码在一个进程(进程A)中运行。我只是用一些其他进程b(TOAD)更改表_b中的值。我只是没能在toad中给出一个commit(进程B) 现在,如

这是一个负面案例

这是我的plsql代码的伪代码

SELECT marks into v_marks from table_a;

SELECT ROLLNO into v_rollno from table_b;

Update table_a set marks = marks- var1  where id=1;

commit;
此plsql代码在一个进程(进程A)中运行。我只是用一些其他进程b(TOAD)更改表_b中的值。我只是没能在toad中给出一个commit(进程B)

现在,如果我的进程A执行,那么它将在第2行等待获取资源

进程A仍在等待获取资源

现在,如果我给出commit,那么这两个过程都将结束

我面临的问题是,表a中的标记在两个进程完成后更新为null


我无法更好地解释这种情况。但是想知道为什么它会被更新为NULL吗?

从伪代码中没有块;写入程序不会阻止读卡器,因此在一个会话中更新
表b
不会影响在任何其他会话中对该表的查询。但是,您也没有在更新中使用
v_标记
v_rollno
,并且正如所写的那样,您正在基于自身更新
标记
,因此如果它已经为空,它将保持为空。您能用一致且最好是可重现的方案更新问题吗?另外,如果
var1
为空,
marks-var1
也为空。@a1ex07 var1声明为整数。它是否可以为空?我对C++平台很有兴趣。在我的语言中,它不会是空的。它可以是0或0junk@VinothKumar-不清楚
var1
是列还是PL/SQL变量,但无论哪种方式,都可以默认为空。我假设它是PL/SQL,在这种情况下:“在变量声明中,初始值是可选的,除非您指定NOTNULL约束”和“如果您没有为变量指定初始值,请在任何其他上下文中使用它之前为它赋值”。如果您没有为
var1
赋值或设置默认值,则该值将为空。@AlexPoole它是plsql变量。它帮助了我