当前位置: 首页 > 图文教程 > Java技术 > Web框架 > Web框架:Spring的闪亮之处:事务管理

Web框架
Web框架介绍---SpringMVC
基于Django框架的敏捷Web开发
驾驭新的Ruby Web框架Waves
JAVA脚本取得struts2 OgnlValueStack中的值
Struts中DownloadAction的使用
优化Hibernate性能的几点建议
Hibernate高级查询实战
对于Struts和Spring两种MVC框架的比较
JSF与Struts的比较 超易懂!
hibernate 主键生成方式
spring acegi 官方例子
获取ApplicationContext的几种方式
Spring与自动调度任务 基于Timer的任务调度器的应用
spring+hibernate 的包的详解,帮你了解每个包的作用以及是否必要导入工程
hibernate 一对一(one to one)级联保存
struts formbean 就是鸡肋
Struts中常用的几种Action
spring的应用事例
struts2(一)
struts2(二)

Web框架:Spring的闪亮之处:事务管理


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 77 ::
收藏到网摘: n/a

谈到Spring的事物管理,感觉是Spring中最闪亮的地方了,网上关于Spring资料很多,今天整理了一篇文章,跟大家分享,希望对大家有所帮助。J2EE中事务处理模式:

1 依赖特定事务资源的事务处理

在应用开发常见模式,即通过特定资源提供的事务机制进行事务管理。

如通过JDBCJTA rollbackcommit方法;Hibernate Transaction

rollbackcommit方法等。

2 依赖容器的参数化事务管理

通过容器提供的集约式参数化事务机制,实现事务的外部管理,如EJB 中的事

务管理模式。

如,下面的EJB事务定义中,将SessionBean MySessiondoService

法定义为Required。也就是说,当MySession.doServer 方法被某个线程调用时,容器将此线程纳入事务管理容器,方法调用过程中如果发生异常,当前事务将被容器自动回

滚,如果方法正常结束,则容器将自动提交当前事务。

<container-transaction >

<method >

<ejb-name>MySession</ejb-name>

<method-intf>Remote</method-intf>

<method-name>doService</method-name>

<method-params>

<method-param>java.lang.String</method-param>

</method-params>

</method>

<trans-attribute>Required</trans-attribute>

</container-transaction>

容器管理的参数化事务为程序开发提供了相当的灵活性,同时因为将事务委

托给容器进行管理,应用逻辑中无需再编写事务代码,大大节省了代码量(特

别是针对需要同时操作多个事务资源的应用),从而提高了生产率。

然而,使用EJB 事务管理的代价相当高昂,撇开EJB 容器不菲的价格,EJB

的学习成本,部署、迁移、维护难度,以及容器本身带来的性能开销(这往往

意味着需要更高的硬件配置)都给我们带来了相当的困惑。此时事务管理所带

来的优势往往还不能抵消上面这些负面影响。

Spring事务管理能给我们带来什么?

对于传统的基于特定事务资源的事务处理而言(如基于JDBC 的数据库访问),

Spring并不会对其产生什么影响,我们照样可以成功编写并运行这样的代码。同时,Spring还提供了一些辅助类可供我们选择使用,这些辅助类简化了传统的数据库操作

流程,在一定程度上节省了工作量,提高了编码效率。

对于依赖容器的参数化事务管理而言,Spring 则表现出了极大的价值。Spring

本身也是一个容器,只是相对EJB容器而言,Spring显得更为轻便小巧。我们无需付

出其他方面的代价,即可通过Spring实现基于容器的事务管理(本质上来讲,Spring

的事务管理是基于动态AOP)。

下面这段xml配置片断展示了Spring中的事务设定方式:

<beans>

<bean id="dataSource"

class="org.apache.commons.dbcp.BasicDataSource"

destroy-method="close">

<property name="driverClassName">

<value>org.gjt.mm.mysql.Driver</value>

</property>

<property name="url">

<value>jdbc:mysql://localhost/sample</value>

</property>

<property name="username">

<value>user</value>

</property>

<property name="password">

<value>mypass</value>

</property>

</bean>

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTr

ansactionManager">

<property name="dataSource">

<ref local="dataSource" />

</property>

</bean>

<bean id="userDAO" class="net.xiaxin.dao.UserDAO">

<property name="dataSource">

<ref local="dataSource" />

</property>

</bean>

<bean id="userDAOProxy"

class="org.springframework.transaction.interceptor.Tran

sactionProxyFactoryBean">

<property name="transactionManager">

<ref bean="transactionManager" />

</property>

<property name="target">

<ref local="userDAO" />

</property>

<property name="transactionAttributes">

<props>

<prop key="insert*">PROPAGATION_REQUIRED</prop>

<prop key="get*">

PROPAGATION_REQUIRED,readOnly

</prop>

</props>

</property>

</bean>

</beans>

配置中包含了dataSourcetransactionManager 等资源定义。这些资源都为

一个名为userDAOProxy TransactionProxyFactoryBean 服务,

userDAOProxy 则对包含实际数据逻辑的userDAO进行了事务性封装。

可以看到,在userDAOProxy "transactionAttributes"属性中,我们定义了

针对userDAO 的事务策略,即将所有名称以insert 开始的方法(如

UserDAO.insertUser方法)纳入事务管理范围。如果此方法中抛出异常,则Spring

将当前事务回滚,如果方法正常结束,则提交事务。

而对所有名称以get 开始的方法(如UserDAO.getUser 方法)则以只读的事务

处理机制进行处理。(设为只读型事务,可以使持久层尝试对数据操作进行优化,如对

于只读事务Hibernate将不执行flush操作,而某些数据库连接池和JDBC 驱动也对

只读型操作进行了特别优化。)

结合上面这段申明带来的感性认知,看看Spring 的事务管理机制与EJB 中事务

管理有何不同,或者有何优势。这里自然有许多方面可以比较,不过,笔者认为其中

最为关键的两点是:

1 Spring可以将任意Java Class 纳入事务管理

这里的UserDAO只是我们编写的一个普通Java Class,其中包含了一些

基本的数据应用逻辑。通过Spring,我们即可简单的实现事务的可配置

化。也就是说,我们可以随意为某个类的某个方法指定事务管理机制。与之对比,如果使用EJB容器提供的事务管理功能,我们不得不按照EJB

规范编将UserDAO 进行改造,将其转换为一个标准的EJB

2 Spring事务管理并不依赖特定的事务资源。

EJB 容器必须依赖于JTA 提供事务支持。而Spring 的事务管理则支持

JDBCJTA 等多种事务资源。这为我们提供了更多的选择,从而也使得

我们的系统部署更加灵活。