我指的是 Enterprise Java Beans 中的容器管理事务属性。我想不出任何使用“强制”和“从不”有意义的用例。任何人都可以解释使用这些交易属性的情况吗?
4 回答
我最近参与了一个项目,该项目坚持所有事务都在应用层(服务类)被标记出来,并且不能直接调用数据访问对象。
这是为了确保在没有调用相关应用程序逻辑的情况下永远不会写入数据库(通常,数据库操作与发送到队列的消息配对)。
在每个 DAO EJB 上应用 MANDATORY 可确保当它们在事务中运行时,调用者的工作是启动一个事务。由于 DAO 是由服务类调用的(默认为 REQUIRED),这意味着它们工作得很好,但任何不小心直接调用它们的人都会得到异常奖励。
这是我对此的看法:
强制:一个 EJB 可能提供了一些内部函数,假设/依赖于调用者的事务已经运行,如果不是,由于各种原因,不能启动一个,所以它会抛出一个 EJB 错误。所以这里真正的问题是为什么这永远是一个要求,我可以设计的唯一场景是在事务开始时可能必须执行特定的事务相关操作,并且某些 EJB 没有为这些操作配备等等被标记为强制性的。我想您也可以使用此属性来确保获得一致且正确排序的锁,如果不这样做可能会导致死锁。
Never:如果在调用 EJB 时事务正在运行,这会强制您的 EJB 抛出异常,同样,真正的问题是什么样的场景需要这样做。参考Mastering EJB Third Edition,Ed Roman 断言该属性通过防止错误地假设 EJB 将参与ACID过程,从而有助于减少客户端编码错误。
也许其他人将能够为这些属性提供更具体的场景。
我有一个强制属性有用的情况:
我有一个 bean,它被许多应用程序调用。根据调用应用程序,我希望能够加入调用事务,或在新事务中运行。所以我定义了2个bean,一个带有RequiresNew,一个带有Required。第二个可以使用 Mandatory,以确保有调用事务,但这不是必需的。
强制和从不用于通过抛出异常明确告知客户端未在事务范围内运行的情况。
强制抛出TransactionRequiredException而从不抛出RemoteException。
例如,如果客户端在事务内部/外部运行并调用企业 bean 的方法,该方法也将在事务内部/外部运行,则不会为SUPPORTS引发异常。但是,如果您使用MANDATORY,对于外部情况,将抛出 TransactionRequiredException。