Java @Transactional(NEVER)的可能用例是什么

Java @Transactional(NEVER)的可能用例是什么,java,jpa,Java,Jpa,文档说明了显而易见的事情: 如果在现有事务内执行,则方法将引发异常。 有人能给出一个有意义的例子,说明何时/为什么可以故意使用它吗?如果您想修改代码中的非事务性资源,并确保其他人知道这一事实,您可以使用此功能。如果您想修改代码中的非事务性资源,并确保其他人知道这一事实,您可以使用此功能。一个用例可能是处理事务或范围的框架相关代码。想想ApacheDeltaspike,arquillian,hibernate 如果公开公共方法,您可能希望确保它们在某些事务中没有被错误使用。与其无意中弄乱打开的事务

文档说明了显而易见的事情:
如果在现有事务内执行,则方法将引发异常。


有人能给出一个有意义的例子,说明何时/为什么可以故意使用它吗?

如果您想修改代码中的非事务性资源,并确保其他人知道这一事实,您可以使用此功能。

如果您想修改代码中的非事务性资源,并确保其他人知道这一事实,您可以使用此功能。

一个用例可能是处理事务或范围的框架相关代码。想想ApacheDeltaspike,arquillian,hibernate


如果公开公共方法,您可能希望确保它们在某些事务中没有被错误使用。与其无意中弄乱打开的事务,不如使用@NEVER快速失败。

一个用例可能是处理事务或作用域的框架相关代码。想想ApacheDeltaspike,arquillian,hibernate


如果公开公共方法,您可能希望确保它们在某些事务中没有被错误使用。与其无意中弄乱打开的事务,不如使用@NEVER快速失败。

好吧,可能有几个用例要求您的代码不要在事务中运行。您将使用“从不强制执行”而不是“不受支持”,这将只是“暂停”当前事务,然后恢复它


我们的一个用例是在一些事务操作之后发送电子邮件。发送电子邮件本身不需要事务处理,为了确保操作成功并且在最后一刻没有回滚,我们的电子邮件发送服务使用NEVER(否则我们可能会意外发送“成功”电子邮件,然后回滚)。这样,如果有人在操作的事务尚未成功提交时调用它,我们会得到一个异常,并且知道这应该得到修复。

好吧,可能有几个用例要求您的代码不在事务中运行。您将使用“从不强制执行”而不是“不受支持”,这将只是“暂停”当前事务,然后恢复它


我们的一个用例是在一些事务操作之后发送电子邮件。发送电子邮件本身不需要事务处理,为了确保操作成功并且在最后一刻没有回滚,我们的电子邮件发送服务使用NEVER(否则我们可能会意外发送“成功”电子邮件,然后回滚)。这样,如果有人在操作的事务尚未成功提交时调用它,我们会得到一个异常,并且知道这应该得到修复。

只是粘贴一个你不拥有的映像不是答案。只是粘贴一个你不拥有的映像不是答案。这是一个很好的例子,但我说的对吗仅当
sendmail()
的调用方不确定自己是否在tx作用域内时才有用?@fyrkov yes这是为了确保调用不会发生在tx作用域内。通常,您在“库”代码中使用“从不”(或相反的强制性代码)(可能只是内部代码)这可能最终会从其他地方调用-因为您不知道其他呼叫者在做什么,所以如果设置不正确,您希望确保这些调用快速失败。这是一个很好的示例,但我说的对吗,它仅在调用
sendmail()时才有用
不确定他是否在tx范围内?@fyrkov是的,这是为了确保呼叫不会发生在tx范围内。通常,您会在“库”代码(可能只是内部代码)中使用NEVER(或相反的强制代码),这些代码最终可能会从其他地方调用-因为您不知道其他调用方在做什么,所以如果设置不正确,您希望确保这些调用快速失败。