自主事务:优点和缺点

8

自主事务可以危险吗?如果是,那么在哪些情况下?什么情况下需要使用自主事务?

3个回答

17

是的,自主事务可能会很危险。

考虑这样一种情况,您有一个主事务。它已经插入/更新/删除了行。如果在其中设置一个自主事务,则:

(1) 它将不会查询任何数据。这是“安全”的情况。独立记录信息时可以使用它,而不会影响主事务的提交(例如,在预期主事务将被回滚时记录错误信息非常有用)。

(2) 它只查询未被主事务更新的数据。这是安全的,但是多余的。该自主事务没有意义。

(3). 它将查询已被主事务更新的数据。这表明设计不当,因为您已经覆盖了某些内容,现在需要回去查看它覆盖之前的内容。有时人们认为自主事务仍将看到主事务的未提交更改,但实际上不会。它读取数据库当前已提交的状态,以及在自主事务中进行的任何更改。有些人(通常是在响应于变异触发器错误而尝试自主事务的人)不关心尝试读取数据时它所处的状态,这些人根本不应该被允许访问数据库。

(4). 它将尝试更新/删除未被主事务更新的数据。同样,这也表明设计不良。无论主事务成功还是失败,这些更改都将被提交(或回滚)。更糟糕的是,您面临第(5)种问题,因为很难在自主事务中确定数据是否已被主事务更新。

(5). 您尝试更新/删除主事务已经更新的数据,此时它将导致死锁并进入一场混乱的局面。


3
唯一铁板钉钉的Autonmous Transactions使用案例是日志记录/审计。其他所有情况都存在风险或者极其危险。 - APC

11

自主事务是否会带来危险?

会。

如果是,那在哪些情况下?

当它们被错误使用时。例如,当用于更改数据时,如果父事务回滚,则应该回滚这些更改。错误使用它们可能会导致数据损坏,因为某些更改的部分被提交,而其他部分未被提交。

什么时候需要使用自主事务?

当一个事务的效果必须存活下来,无论父事务是提交还是回滚时,就需要使用自主事务。一个很好的例子是将进程的进展和活动记录到数据库表中的过程。


0

何时需要使用自主事务?

请检查我的问题:如何使LOCK在COMMIT之后仍然存在,或者如何在没有COMMIT和丢失LOCK的情况下将对LOCKed表的更改传播到另一个会话

我们按顺序摄取业务配置,并应禁止并行处理。

我使用锁定表格进行配置,并相应地更新其他表格。由于我们无法承担在所有记录上保持事务的成本,因此我将每个批次的更新提交给其他表格 - 碰撞的概率接近0.99。

每次由于并发访问而导致的失败都会被持久化到日志中以供稍后尝试更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接