没有提交连接的回滚性能
Performance of rollback on nothing to commit connection
我有一个上下文,其中有一个连接池,其中的连接被释放,但不保证已提交或回滚。
在这种情况下,我正在考虑在池本身中对每个被释放的连接实施回滚,但我猜这个操作可能会对性能产生什么影响。
这个问题专门针对 Oracle DB。在没有挂起的插入或更新的事务中执行回滚时,Oracle 会执行什么操作?例如,如果您连续回滚两次或提交并立即回滚,会发生什么(在性能方面)?
不必要地回滚每个会话不会对性能产生影响。与打开和关闭会话相比,回滚实际上是免费的。例如,下面的 PL/SQL 块在我的机器上在 6 秒内回滚了一百万次。
begin
for i in 1 .. 1000000 loop
rollback;
end loop;
end;
/
Oracle 在提交或回滚任何内容之前将每个更改写入 UNDO table 空间。这种方法会产生一些显着的成本,但这意味着当您回滚时,Oracle 不必检查数据库中的每个 table,它只需要检查 UNDO 数据中与当前事务相关的任何内容。如果什么都没有找到,则无需执行任何操作。我猜想每次回滚至多需要一次索引查找。如果每次会话仅发生一次,则无需担心。
我有一个上下文,其中有一个连接池,其中的连接被释放,但不保证已提交或回滚。
在这种情况下,我正在考虑在池本身中对每个被释放的连接实施回滚,但我猜这个操作可能会对性能产生什么影响。
这个问题专门针对 Oracle DB。在没有挂起的插入或更新的事务中执行回滚时,Oracle 会执行什么操作?例如,如果您连续回滚两次或提交并立即回滚,会发生什么(在性能方面)?
不必要地回滚每个会话不会对性能产生影响。与打开和关闭会话相比,回滚实际上是免费的。例如,下面的 PL/SQL 块在我的机器上在 6 秒内回滚了一百万次。
begin
for i in 1 .. 1000000 loop
rollback;
end loop;
end;
/
Oracle 在提交或回滚任何内容之前将每个更改写入 UNDO table 空间。这种方法会产生一些显着的成本,但这意味着当您回滚时,Oracle 不必检查数据库中的每个 table,它只需要检查 UNDO 数据中与当前事务相关的任何内容。如果什么都没有找到,则无需执行任何操作。我猜想每次回滚至多需要一次索引查找。如果每次会话仅发生一次,则无需担心。