9.3. 声明事务的划分
使用 Blueprint XML 时,您还可以通过在 Blueprint XML 文件中声明事务策略来分离事务。通过将适当的事务策略应用到 bean 或 bean 方法,例如 Required
策略,您可以确保在调用该特定 bean 或 bean 方法时启动事务。在 bean 方法的末尾,事务被提交。这个方法类似于事务在企业 Java Beans 中处理的方式。
OSGi 声明性事务允许您在 Blueprint 文件中的以下范围中定义事务策略:
另请参阅: 第 9.3.3 节 “tx:transaction
属性的描述”。
9.3.1. bean-level 声明
要在 bean 级别上声明事务策略,请插入 tx:transaction
元素作为 bean
元素的子级,如下所示:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.1.0"> <bean id="accountFoo" class="org.jboss.fuse.example.Account"> <tx:transaction method="*" value="Required" /> <property name="accountName" value="Foo" /> </bean> <bean id="accountBar" class="org.jboss.fuse.example.Account"> <tx:transaction method="*" value="Required" /> <property name="accountName" value="Bar" /> </bean> </blueprint>
在前面的示例中,所需的事务策略应用于 accountFoo
bean 的所有方法,以及 accountBar
bean,其中 method 属性指定通配符 *
,以匹配所有 bean 方法。
9.3.2. 顶级声明
要在顶层声明事务策略,请插入 tx:transaction
元素作为 blueprint
元素的子,如下所示:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.1.0"> <tx:transaction bean="account*" value="Required" /> <bean id="accountFoo" class="org.jboss.fuse.example.Account"> <property name="accountName" value="Foo" /> </bean> <bean id="accountBar" class="org.jboss.fuse.example.Account"> <property name="accountName" value="Bar" /> </bean> </blueprint>
在上例中,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="account*,jms*" value="..." /> </blueprint>
如果省略 bean 属性,则默认为
*
(匹配蓝图文件中所有非syntic Bean)。方法
(顶级和 bean-level)指定事务策略应用到的方法名称列表(comma 或空格分开)。例如:
<bean id="accountFoo" class="org.jboss.fuse.example.Account"> <tx:transaction method="debit,credit,transfer" value="Required" /> <property name="accountName" value="Foo" /> </bean>
您还可以使用通配符字符
*
,它在每个列表条目中最多可能会出现一次。如果省略了 method 属性,则默认为
*
(匹配适用 Bean 中的所有方法)。- value
(顶级和 bean-level)指定事务策略。策略值与 EJB 3.0 规格中定义的策略具有相同的语义,如下所示:
-
必需
- 支持当前事务 ; 如果不存在,创建一个新事务。 -
必需
- 支持当前事务;如果没有当前事务,则抛出异常。 -
RequiresNew
- 创建新的事务,挂起当前事务(如果存在)。 -
支持
- 支持当前事务;如果没有存在,则非事务执行。 -
NotSupported
- 不支持当前事务,而是始终以非事务执行。 -
Never
- 不支持当前事务 ; 如果当前事务存在,抛出异常。
-