我有两个都需要交易的功能。一个正在呼叫另一个。我有一些代码可以使用SAVEPOINT将此类交易嵌套到一个交易中。
如果它们具有相同的事务隔离级别,则没有问题。现在,如果没有,我还有办法“正确地”合并交易吗?
如果我将两个事务都限制在最高的隔离级别下,那么除了降低性能之外,还有什么风险?
答案 0 :(得分:0)
在这种情况下,是的,通常可以将事务合并到更严格的隔离级别中。
冒很大的风险,就是更高的隔离级别将捕获更多的序列化错误(即,REPEATABLE READ中的ERROR: could not serialize access due to concurrent update
和SERIALIZABLE中的ERROR: could not serialize access due to read/write dependencies among transactions
)。处理这些序列化失败的典型方法是重试事务,但是您应该在应用程序上下文中验证这是否有意义。
可能发生的另一个可能的错误是死锁。 Postgres应该检测到这些并打破死锁(之后失败的事务应重试),但是如果可以,则应始终尝试编写应用程序,以使死锁最初不存在。通常,避免死锁的主要技术是确保所有获取任何锁(隐式或显式锁)的应用程序都以一致的顺序获取这些锁。
如果您的应用程序需要向另一个外部服务发出请求,则可能需要格外小心,因为您可能需要验证重试是否会导致您发出不必要的重复请求,特别是如果这些外部请求不是幂等的