9.3. 声明性事务划分
使用蓝图 XML 时,您还可以通过在 Blueprint XML 文件中声明事务来分离事务。例如,通过将适当的事务策略应用到 bean 或 bean 方法,您可以确保在调用特定 bean 或 bean 方法时启动事务。在 bean 方法的末尾,交易会被提交。这种方法和交易在企业 Java Bean 中处理的方式类似。
OSGi 声明事务允许您在蓝图中的以下范围定义事务策略:
另请参阅: 第 9.3.3 节 “tx:transaction 属性的描述”。
9.3.1. bean-level 声明 复制链接链接已复制到粘贴板!
要在 bean 级别声明事务策略,插入 tx:transaction 元素作为 bean 元素的子项,如下所示:
在前面的示例中,所需的事务策略应用于 accountFoo bean 和 accountBar bean 的所有方法,其中 method 属性指定通配符 :* 以匹配所有 bean 方法。
9.3.2. 顶级声明 复制链接链接已复制到粘贴板!
要在顶层声明事务策略,在 tx:transaction 元素中插入 tx:transaction 元素作为 蓝图 元素的子项,如下所示:
在前面的示例中,Required 事务策略应用于 ID 与模式匹配的所有 bean 的所有方法。
9.3.3. tx:transaction 属性的描述 复制链接链接已复制到粘贴板!
tx:transaction 元素支持以下属性:
bean(仅限顶级)指定事务策略应用到的 bean ID(组合或空格分隔)的列表。例如:
<blueprint ...> <tx:transaction bean="accountFoo,accountBar" value="..." /> </blueprint><blueprint ...> <tx:transaction bean="accountFoo,accountBar" value="..." /> </blueprint>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以使用通配符字符
*,每个列表条目中最多可能会显示一次。例如:<blueprint ...> <tx:transaction bean="account*,jms*" value="..." /> </blueprint><blueprint ...> <tx:transaction bean="account*,jms*" value="..." /> </blueprint>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果省略了 bean 属性,则默认为
*(与蓝图文件中所有非动态 Bean 匹配)。method(顶级和 bean 级)指定事务策略应用到的方法名称(组合或空格分隔)的列表。例如:
<bean id="accountFoo" class="org.jboss.fuse.example.Account"> <tx:transaction method="debit,credit,transfer" value="Required" /> <property name="accountName" value="Foo" /> </bean><bean id="accountFoo" class="org.jboss.fuse.example.Account"> <tx:transaction method="debit,credit,transfer" value="Required" /> <property name="accountName" value="Foo" /> </bean>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可以使用通配符字符
*,每个列表条目中最多可能会显示一次。如果省略了 method 属性,则默认为
*(匹配适用 Bean 中的所有方法)。- value
(顶级和 bean 级)指定事务策略。策略值具有与 EJB 3.0 规范中定义的策略相同的语义,如下所示:
-
必需- 支持当前的事务;如果不存在,则创建一个新事务。 -
强制- 支持当前事务;如果不存在当前事务,则抛出异常。 -
RequiresNew- 创建一个新事务,并暂停当前事务(如果存在)。 -
支持- 支持当前的事务;如果不存在,则以非交易方式执行。 -
NotSupported- 不支持当前的事务,而是始终以非事务方式执行。 -
Never- 不支持当前的事务 ; 如果当前事务存在,则抛出异常。
-