我正在尝试使用 Kotlin 的 Arrow 库Either对象来处理项目中的异常。
到目前为止,我的经验还不错,但我正在努力寻找一种方法来处理事务Either,特别是回滚。在 Spring 中抛出 aRuntimeException是导致事务回滚的可靠方法。但是,通过使用Either不会引发异常,因此不会触发回滚。
您可以将此视为一个多方面的问题:
Either适合真实Exception处理?不是替代控制流,我的意思是程序流需要停止的真正错误情况。transactionManager编程方式使用- 你能避免这种情况吗?Either?那些开发过专业的多线程 Java Spring 应用程序的人可能可以证明 volatile 关键字的使用几乎不存在(以及与此相关的其他线程控制),尽管在需要时错过它可能会带来灾难性的后果。
让我提供一个非常常见的代码示例
@Service
public class FeatureFlagHolder {
private boolean featureFlagActivated = false;
public void activateFeatureFlag() {
featureFlagActivated = true;
}
// similar code to de-activate
public boolean isFeatureFlagActivated() {
return featureFlagActivated;
}
}
Run Code Online (Sandbox Code Playgroud)
假设改变和读取状态的线程featureFlagActivated不同。AFAIK,读取布尔值的线程可以根据 JVM 缓存其值并且从不刷新它。在实践中,我从未见过这种情况发生。事实上,我什至从未见过布尔值在读取时没有立即更新。
这是为什么?