在您的应用程序中,在提交或回滚之前保持事务打开的“长时间”是多少?分钟?秒?小时?
在哪个数据库上?
我可能会为此大发雷霆,但你真的应该尽量避免使用游标,因为它们会严重影响性能。如果你必须使用它,你应该尽可能保持打开它的绝对最短时间,以便尽快释放被游标阻塞的资源。
交易:分钟。
光标:最多 0 秒,如果您使用光标,我们会解雇您。
当您考虑到我们处于一个必须运行 sql server 的高可用性 Web 环境中时,这并不荒谬,而且由于无法准确地对它们进行版本化和维护,我们甚至不允许存储过程。如果我们使用 oracle 可能。
一般来说,我同意其他答案:尽可能避免使用游标(在大多数情况下)并尽快关闭它们。
但是:这完全取决于您工作的环境。
@lomaxx,@ChanChan:据我所知,游标只是 SQL Server 和 Sybase(T-SQL 变体)上的问题。如果您选择的数据库是 Oracle,那么游标就是您的朋友。我见过许多使用游标实际上提高了性能的案例。游标是一种非常有用的机制,而且说“如果你使用游标,我们就会解雇你”之类的话有点荒谬。
话虽如此,您只想将光标保持在所需的绝对最小值。如果不了解问题域,指定最大时间将是任意且毫无意义的。
@nineside:抛开性能问题不谈,这也是关于使用正确的工具来完成这项工作。考虑到将光标从查询中移出到代码中的选择,我认为 100 次中有 99 次最好将循环逻辑放入某种托管代码中。这样做可以让您获得使用调试器、编译时错误检查、类型安全等的优势。
我对这个问题的回答仍然是一样的,如果您使用的是游标,请尽快关闭它,在 oracle 中我也会尝试使用显式游标。