有谁能建议,我们是否应该在打开光标之后和关闭光标之前使用commit?
gstyhher1#
在大多数情况下,这是不相关的。游标是一种用于检索数据的构造。一旦记录被读取,游标在进程中什么时候被关闭都没有关系,只要它是关闭的。COMMIT应该在事务完成时发出,而不是在此之前。这两个操作的顺序很重要的一种情况是当我们执行CURSOR FOR循环时。非常重要的是,任何COMMIT都应该发生在这个循环之外,也就是说,在我们打开游标之前或关闭游标之后。否则,我们可能会在读取一致性方面出现问题。有些人会争辩说,由于一些复杂的原因,他们必须在循环内提交,但他们几乎总是错误的。最后一个案例的重要性不应被高估。大多数事务应该在PL/SQL游标中使用SQL而不是DML,因此它很少适用。
wooyq4lh2#
如果游标使用FOR UPDATE锁定记录,则提交将释放所有锁定。(事实上,所有持有的锁都由提交释放。)此外,由于“fetch across commit”,您更有可能获得“ORA-01555 Snapshot too old”错误-请参阅this AskTom thread。
vatpfxk53#
这取决于你想完成什么。有时候你想这么做,有时候你不想。你能具体说明你想达到什么目的吗?
x6h2sr284#
取决于你的方法,例如在Pragma中,自治事务可能会在“整个”事务结束时被期望,以避免记录部分信息,但是当你需要在同一进程中读取另一个事务并尽可能快地“发布”信息时,你可以使用COMMIT。问候。
4条答案
按热度按时间gstyhher1#
在大多数情况下,这是不相关的。
游标是一种用于检索数据的构造。一旦记录被读取,游标在进程中什么时候被关闭都没有关系,只要它是关闭的。
COMMIT应该在事务完成时发出,而不是在此之前。
这两个操作的顺序很重要的一种情况是当我们执行CURSOR FOR循环时。非常重要的是,任何COMMIT都应该发生在这个循环之外,也就是说,在我们打开游标之前或关闭游标之后。否则,我们可能会在读取一致性方面出现问题。有些人会争辩说,由于一些复杂的原因,他们必须在循环内提交,但他们几乎总是错误的。
最后一个案例的重要性不应被高估。大多数事务应该在PL/SQL游标中使用SQL而不是DML,因此它很少适用。
wooyq4lh2#
如果游标使用FOR UPDATE锁定记录,则提交将释放所有锁定。(事实上,所有持有的锁都由提交释放。)
此外,由于“fetch across commit”,您更有可能获得“ORA-01555 Snapshot too old”错误-请参阅this AskTom thread。
vatpfxk53#
这取决于你想完成什么。有时候你想这么做,有时候你不想。你能具体说明你想达到什么目的吗?
x6h2sr284#
取决于你的方法,例如在Pragma中,自治事务可能会在“整个”事务结束时被期望,以避免记录部分信息,但是当你需要在同一进程中读取另一个事务并尽可能快地“发布”信息时,你可以使用COMMIT。问候。