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