在 TransactionProxyFactoryBean 上有 setTransactionAttributeSource()与 setTransactionAttributes()方法,它们是用来设定交易属性的策略实例。
org.springframework.transaction.interceptor.TransactionAttributeSource上有一 个 getTransactionAttribute()方法,您可以根据传递给它的Method实例与Class实例,决定该返回一个什么内容的org.springframework.transaction
.interceptor.TransactionAttribute 实例,一个最简单 的 TransactionAttributeSource 实现是 org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource, 对于每一个方法呼叫都会应用交易,它会返回的 TransactionAttribute 实例之预设传播行为是 PROPAGATION_REQUIRED, 隔离层级为 ISOLATION_DEFAULE。
一个应用的例子如下所示:
...
<bean id="transactionAttributeSource" class="org.springframework.transaction.interceptor.
→?MatchAlwaysTransactionAttributeSource"/>
<bean id="userDAOProxy" class="org.springframework.transaction.
→?interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>onlyfun.caterpillar.IUserDAO</value>
</list>
</property>
<property name="target">
<ref bean="userDAO"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="transactionAttributeSource"/>
</property>
</bean>
...
您可以使用 org.springframework.transaction.interceptor.DefaultTransactionAttribute, 并设置自己的交易策略,之后将之设定给 TransactionAttributeSource,例如:
...
<bean id="myTransactionAttribute" class="org.springframework.transaction.
→?interceptor.DefaultTransactionAttribute">
<property name="propagationBehaviorName">
<value>PROPAGATION_REQUIRES_NEW</value>
</property>
<property name="isolationLevelName">
<value>ISOLATION_REPEATABLE_READ</value>
</property>
</bean>
<bean id="transactionAttributeSource" class="org.springframework.transaction.
→?interceptor.MatchAlwaysTransactionAttributeSource">
<property name="transactionAttribute">
<ref bean="myTransactionAttribute"/>
</property>
</bean>
<bean id="userDAOProxy" class="org.springframework.transaction.
→?interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>onlyfun.caterpillar.IUserDAO</value>
</list>
</property>
<property name="target">
<ref bean="userDAO"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="transactionAttributeSource"/>
</property>
</bean>
...
可以使用 org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource 来 指定某些方法要应用交易,以及要应用的交易策略,例如:
...
<bean id="transactionAttributeSource" class="org.springframework.transaction.
→?interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props>
<prop key="insert*"> PROPAGATION_REQUIRES_NEW
</prop>
</props>
</property>
</bean>
<bean id="userDAOProxy" class="org.springframework.transaction.
→?interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>onlyfun.caterpillar.IUserDAO</value>
</list>
</property>
<property name="target">
<ref bean="userDAO"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="transactionAttributeSource"/>
</property>
</bean>
...
在 NameMatchTransactionAttributeSource 的"properties"属性上,可以指定方法名称与交易策 略,方法名称的 指定可以指定全名,也可以使用 Wildcard 来指定,例如上面的指定中,只要方 法名称以 insert 为开头的都会应用相对应的交易策略。
在指定交易策略时,指定的格式如下: 传播行为,隔离层级,唯读,+例外, -例外 除了传播行为一定要设置之外,其它都可选择性的设置,中间以逗号区隔,例如:
PROPAGATION_REQUIRED,readOnly,-MyCheckedException
MyCheckedException 前面加上"-"时,表示发生指定例外时撤消操作,如果前面加上"+",表示 发生例外时立即提交。
在比较简单的设置中,可以仅设置 TransactionProxyFactoryBean,并在它的 "transactionAttributes"属性上直接设置要应用交易的方法及交易策略,例如:
...
<bean id="userDAOProxy" class="org.springframework.transaction.
→?interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>onlyfun.caterpillar.IUserDAO</value>
</list>
</property>
<property name="target">
<ref bean="userDAO"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
...
您甚至也可以直接指定 TransactionInterceptor,以获得更多的控制,例如:
...
<bean id="transactionInterceptor" class="org.springframework.transaction.
→?interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<value>
onlyfun.caterpillar.UserDAO.insert*=PROPAGATION_REQUIRED
</value>
</property>
</bean>
<bean id="userDAOProxy" class="org.springframework.aop.
→?framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>onlyfun.caterpillar.IUserDAO</value>
</list>
</property>
<property name="target">
<ref bean="userDAO"/>
</property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean>
...
选择哪一种设定方式是需求的问题,您可以尝试在 DeclarativeTransactionDemo 专案的 Bean 定 义档上设定以上所介绍的方式,基于篇幅的限制,以上仅列出部份的设定内容。
分享到:
相关推荐
EJB事物详细讲解:TransactionAttributeType.MANDATORY;TransactionAttributeType.REQUIRED;TransactionAttributeType.REQUIRES_NEW;TransactionAttributeType.SUPPORTS;TransactionAttributeType.NOT_SUPPORTED...
1. 对在上下文中配置的属性的处理,这里涉及的类是 TransactionAttributeSourceAdvisor,这是一个通知器,用它来对属性值进行处理,属性信息放在 TransactionAttribute 中来使用,而这些属性的处理往往是和对切入点...
在Spring框架中,事务管理...例如,`PlatformTransactionManager`的实现类如何与`TransactionDefinition`和`TransactionStatus`交互,`TransactionInterceptor`如何利用`TransactionAttribute`来决定事务的边界,以及`...
首先,我们需要创建一个表示事务特性的自定义Attribute,例如`TransactionAttribute`。这个特性可以包含关于事务的配置信息,如隔离级别、是否只读等。下面是一个简单的示例: ```csharp using System; using ...
例如,`@TransactionAttribute(TransactionAttributeType.REQUIRED)`表示如果当前没有事务,容器会开始一个新的;`@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)`则会在新事务中执行该方法,即使...
Spring 对交易的支援 JDBC 编程式交易管理 JDBC 宣告式交易管理 交易的属性介绍 TransactionAttributeSource、 TransactionAttribute Hibernate 支援 Spring 整合了对 Hibernate 的设定...
4. **注解(Annotations)**:EJB3大量使用注解来声明组件的行为,如`@WebService`、`@TransactionAttribute`等,减少了XML配置文件的使用,提高了开发效率。 5. **依赖注入(Dependency Injection, DI)**:EJB3...
5. **-aspect-oriented programming (AOP) 支持**:EJB 3.0通过声明式事务管理(`@TransactionAttribute`)和安全访问控制(`@RolesAllowed`)实现了面向切面编程的思想,使得开发者无需编写过多的底层代码。...
EJB3提供了容器管理的事务(Container Managed Transactions),开发者只需在方法上添加`@TransactionAttribute`注解,如`@TransactionAttribute(TransactionAttributeType.REQUIRED)`,即可让容器自动处理事务的...
6. **事务管理(Transaction Management)**:EJB容器自动处理事务,可以根据业务需求通过注解如`@TransactionAttribute`来设置事务的属性,如REQUIRED、REQUIRES_NEW等。 7. **并发控制(Concurrency Control)**...
根据不同的方法注解,如`@TransactionAttribute(TransactionAttributeType.REQUIRED)`,容器会自动启动和管理事务。 7. **JAXB and JAX-RS**:EJB3.0经常与JAXB(Java Architecture for XML Binding)和JAX-RS...
6. **容器管理的事务(Container-Managed Transactions)**:EJB 3.0提供自动事务管理,开发者只需通过设置事务属性(如`@TransactionAttribute`),容器就会根据这些属性自动处理事务的开始、提交或回滚。...
- 容器管理的事务:EJB3.0支持声明式事务管理,开发者只需在接口或方法上添加@TransactionAttribute注解即可。 2. **Jboss与EJB3.0**: - JBoss AS (Application Server) 是一个开源的应用服务器,完全支持EJB3.0...
- **示例**:使用 `@TransactionAttribute` 注解控制事务属性: ```java @Stateless @TransactionAttribute(TransactionAttributeType.REQUIRED) public class MySessionBean { public void doSomething() { /...
在上述示例中,`@TransactionManagement`注解被用来指定事务管理策略,而`@TransactionAttribute`则定义了具体的方法事务属性。 调用EJB时,通常通过JNDI(Java Naming and Directory Interface)来查找并实例化EJB...
- EJB事务管理:EJB支持声明式事务,通过在方法上添加事务属性(如@TransactionAttribute)来定义事务边界。容器负责事务的开始、提交、回滚等操作,也可以使用编程式事务管理,由开发者显式控制。 总的来说,EJB...
在实际开发中,EJB还涉及到其他组件,如EntityBean(处理持久化数据)、MessageDrivenBean(处理消息队列)以及更多的接口和服务,如EJBContext(提供上下文信息)和TransactionAttribute(定义事务属性)。...
EJB3提供了自动的事务管理,开发者可以通过`@TransactionAttribute`注解指定事务属性,如REQUIRED、REQUIRES_NEW等,以控制事务的边界。 此外,EJB3还引入了依赖注入(Dependency Injection,DI)和面向切面编程...
通过`@TransactionAttribute`注解,开发者可以选择不同的事务策略,如REQUIRED、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和SUPPORTS,无需手动管理事务开始和结束。 消息驱动Bean(MDB)在EJB 3.0中也得到了...
默认情况下,容器会自动为EJB方法提供适当的事务边界,开发者可以通过`@TransactionAttribute`注解来定制事务策略。 在《中文最新EJB3.0实例教程》中,你将学习如何创建和部署EJB3.0组件,如何使用JPA进行数据持久...