`
dyllove98
  • 浏览: 1409721 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:39191
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:80274
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:133401
社区版块
存档分类
最新评论

TransactionAttributeSource、 TransactionAttribute

阅读更多
在 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_transaction(EJB事物)

    EJB事物详细讲解:TransactionAttributeType.MANDATORY;TransactionAttributeType.REQUIRED;TransactionAttributeType.REQUIRES_NEW;TransactionAttributeType.SUPPORTS;TransactionAttributeType.NOT_SUPPORTED...

    Spring源代码解析(六):Spring声明式事务处理.doc

    1. 对在上下文中配置的属性的处理,这里涉及的类是 TransactionAttributeSourceAdvisor,这是一个通知器,用它来对属性值进行处理,属性信息放在 TransactionAttribute 中来使用,而这些属性的处理往往是和对切入点...

    Spring事务相关类Uml图

    在Spring框架中,事务管理...例如,`PlatformTransactionManager`的实现类如何与`TransactionDefinition`和`TransactionStatus`交互,`TransactionInterceptor`如何利用`TransactionAttribute`来决定事务的边界,以及`...

    C#自己实现AOP的事务操作

    首先,我们需要创建一个表示事务特性的自定义Attribute,例如`TransactionAttribute`。这个特性可以包含关于事务的配置信息,如隔离级别、是否只读等。下面是一个简单的示例: ```csharp using System; using ...

    ejb3.0 分布式事务

    例如,`@TransactionAttribute(TransactionAttributeType.REQUIRED)`表示如果当前没有事务,容器会开始一个新的;`@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)`则会在新事务中执行该方法,即使...

    开源框架 Spring Gossip

    Spring 对交易的支援 JDBC 编程式交易管理 JDBC 宣告式交易管理 交易的属性介绍 TransactionAttributeSource、 TransactionAttribute Hibernate 支援 Spring 整合了对 Hibernate 的设定...

    EJB3 In Action download

    4. **注解(Annotations)**:EJB3大量使用注解来声明组件的行为,如`@WebService`、`@TransactionAttribute`等,减少了XML配置文件的使用,提高了开发效率。 5. **依赖注入(Dependency Injection, DI)**:EJB3...

    ejb3.0实例教程的例子

    5. **-aspect-oriented programming (AOP) 支持**:EJB 3.0通过声明式事务管理(`@TransactionAttribute`)和安全访问控制(`@RolesAllowed`)实现了面向切面编程的思想,使得开发者无需编写过多的底层代码。...

    EJB3入门

    EJB3提供了容器管理的事务(Container Managed Transactions),开发者只需在方法上添加`@TransactionAttribute`注解,如`@TransactionAttribute(TransactionAttributeType.REQUIRED)`,即可让容器自动处理事务的...

    ejb3.0实例教程

    6. **事务管理(Transaction Management)**:EJB容器自动处理事务,可以根据业务需求通过注解如`@TransactionAttribute`来设置事务的属性,如REQUIRED、REQUIRES_NEW等。 7. **并发控制(Concurrency Control)**...

    EJB3.0开发

    根据不同的方法注解,如`@TransactionAttribute(TransactionAttributeType.REQUIRED)`,容器会自动启动和管理事务。 7. **JAXB and JAX-RS**:EJB3.0经常与JAXB(Java Architecture for XML Binding)和JAX-RS...

    ejb3.0

    6. **容器管理的事务(Container-Managed Transactions)**:EJB 3.0提供自动事务管理,开发者只需通过设置事务属性(如`@TransactionAttribute`),容器就会根据这些属性自动处理事务的开始、提交或回滚。...

    Jboss下EJB3实例教程

    - 容器管理的事务:EJB3.0支持声明式事务管理,开发者只需在接口或方法上添加@TransactionAttribute注解即可。 2. **Jboss与EJB3.0**: - JBoss AS (Application Server) 是一个开源的应用服务器,完全支持EJB3.0...

    EJB3.0 in action

    - **示例**:使用 `@TransactionAttribute` 注解控制事务属性: ```java @Stateless @TransactionAttribute(TransactionAttributeType.REQUIRED) public class MySessionBean { public void doSomething() { /...

    JavaEE5学习笔记07-Web层与EJB集成总结

    在上述示例中,`@TransactionManagement`注解被用来指定事务管理策略,而`@TransactionAttribute`则定义了具体的方法事务属性。 调用EJB时,通常通过JNDI(Java Naming and Directory Interface)来查找并实例化EJB...

    EJB003软件开发考试培训资料

    - EJB事务管理:EJB支持声明式事务,通过在方法上添加事务属性(如@TransactionAttribute)来定义事务边界。容器负责事务的开始、提交、回滚等操作,也可以使用编程式事务管理,由开发者显式控制。 总的来说,EJB...

    EJB轻松学习进阶之三

    在实际开发中,EJB还涉及到其他组件,如EntityBean(处理持久化数据)、MessageDrivenBean(处理消息队列)以及更多的接口和服务,如EJBContext(提供上下文信息)和TransactionAttribute(定义事务属性)。...

    ejb3.rar_EJB3

    EJB3提供了自动的事务管理,开发者可以通过`@TransactionAttribute`注解指定事务属性,如REQUIRED、REQUIRES_NEW等,以控制事务的边界。 此外,EJB3还引入了依赖注入(Dependency Injection,DI)和面向切面编程...

    EJB3.0源代码

    通过`@TransactionAttribute`注解,开发者可以选择不同的事务策略,如REQUIRED、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和SUPPORTS,无需手动管理事务开始和结束。 消息驱动Bean(MDB)在EJB 3.0中也得到了...

    中文最新EJB3.0实例教程下载

    默认情况下,容器会自动为EJB方法提供适当的事务边界,开发者可以通过`@TransactionAttribute`注解来定制事务策略。 在《中文最新EJB3.0实例教程》中,你将学习如何创建和部署EJB3.0组件,如何使用JPA进行数据持久...

Global site tag (gtag.js) - Google Analytics