我应该回滚失败的SELECT语句还是提交成功的语句?

aw *_*rud 6 php sql oracle transactions rollback

出于习惯,我一直在我的应用程序代码中使用try/catch块来处理所有SQL查询,并在catch块的开头进行回滚.我也一直在承诺那些成功的.这是必要SELECT的吗?它是否释放了数据库方面的东西?select语句不会改变任何数据,所以它似乎有点无意义,但也许有一些我不知道的原因.

例如

try {
  $results = oci_execute($statement)
  oci_commit($connection);
  return $results;
}
catch {
  oci_rollback($connection)
  throw new SqlException("failed");
}
Run Code Online (Sandbox Code Playgroud)

Qua*_*noi 7

SELECTOracle(除非它们SELECT FOR UPDATE)中的语句从不锁定任何记录,也不会隐式打开事务.

除非您DML在交易中发布任何操作,否则无论您是提交还是回滚交易都无关紧要.

  • @Adam:`UNDO`是由其他事务生成的,而不是保留光标的事件(我们假设它是只读的).其他事务可能会改变数据,修改数据页面(在这种情况下,`UNDO`将生成并保持到事务结束)并提交(在这种情况下,`UNDO`被释放并标记为可以自由重写).在只读游标中,只有在光标所需的数据被提交的并发事务覆盖时,才会生成`ORA-01555`.同样,游标本身不会锁定数据,生成任何"UNDO"甚至锁定它需要的"UNDO". (2认同)