Spring声明式事务配置管理方法

环境配置

  项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring2.0AOP类库即可。添加方法:

  点击项目右键->BuildPath->Addlibrarys:

  

  打开AddLibraries对话框,然后选定MyEclipseLibraries:

  点击Next,找到Spring2.0aopLibraries并勾选上,点击finsh即可。

  如果在项目里面能看到下面的库文件,说明已经安装成功。

  事务配置

  首先在/WEB-INF/applicationContext.xml添加以下内容:


<!--配置事务管理器-->

<beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<propertyname="sessionFactory">

<refbean="mySessionFactory"/>

</property>

</bean>

注:这是作为公共使用的事务管理器Bean。这个会是事先配置好的,不需各个模块各自去配。

  下面就开始配置各个模块所必须的部分,在各自的applicationContext-XXX-beans.xml配置的对于事务管理的详细信息。

  首先就是配置事务的传播特性,如下:


<!--配置事务传播特性-->

<tx:adviceid="TestAdvice"transaction-manager="transactionManager">

<tx:attributes>

<tx:methodname="save*"propagation="REQUIRED"/>

<tx:methodname="del*"propagation="REQUIRED"/>

<tx:methodname="update*"propagation="REQUIRED"/>

<tx:methodname="add*"propagation="REQUIRED"/>

<tx:methodname="find*"propagation="REQUIRED"/>

<tx:methodname="get*"propagation="REQUIRED"/>

<tx:methodname="apply*"propagation="REQUIRED"/>

</tx:attributes>

</tx:advice>

<!--配置参与事务的类-->

<aop:config>

<aop:pointcutid="allTestServiceMethod"expression="execution(*com.test.testAda.test.model.service.*.*(..))"/>

<aop:advisorpointcut-ref="allTestServiceMethod"advice-ref="TestAdvice"/>

</aop:config>

  需要注意的地方:

  (1)advice(建议)的命名:由于每个模块都会有自己的Advice,所以在命名上需要作出规范,初步的构想就是模块名+Advice(只是一种命名规范)。

  (2)tx:attribute标签所配置的是作为事务的方法的命名类型。

  如<tx:methodname="save*"propagation="REQUIRED"/>

  其中*为通配符,即代表以save为开头的所有方法,即表示符合此命名规则的方法作为一个事务。

  propagation="REQUIRED"代表支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

  (3)aop:pointcut标签配置参与事务的类,由于是在Service中进行数据库业务操作,配的应该是包含那些作为事务的方法的Service类。

  首先应该特别注意的是id的命名,同样由于每个模块都有自己事务切面,所以我觉得初步的命名规则因为all+模块名+ServiceMethod。而且每个模块之间不同之处还在于以下一句:

  expression="execution(*com.test.testAda.test.model.service.*.*(..))"

  其中第一个*代表返回值,第二*代表service下子包,第三个*代表方法名,“(..)”代表方法参数。

  (4)aop:advisor标签就是把上面我们所配置的事务管理两部分属性整合起来作为整个事务管理。

  图解:

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-24 16:07:41

Spring声明式事务配置管理方法的相关文章

spring声明式事务

问题描述 最近研究了很久spring控制事务的问题,也看了源代码,但是小弟有一点问题不明白在事务方法中如publicvoidupdate(){//dataStore.currentConnection().setAutoCommit(false);Studentstu=newStudent();stu.setId("3");stu.setName("潘潘");dataStore.insert(stu);}这样是没有问题的,可以插入oracle数据库中,如果把注释打开

Spring声明式事务管理源码解读之事务提交

在下面的文章中,我讲会多次提到第一篇文章,第一篇文章是:Spring声明式事务管 理源码解读之事务开始 如果要理解事务提交的话,理解事务开始是一个前提条件,所以请先看第一篇文章,再 来看这篇 如果你仔细看下去,我想肯定是有很多收获,因为我们确实能从spring的代码和思想 中学到很多东西. 正文: 其实俺的感觉就是事务提交要比事务开始复杂,看事务是否提交我们还是要回到 TransactionInterceptor类的invoke方法 Java代码 public Object invoke(Met

Spring声明式事务管理源码解读之事务开始

这个是我昨天在解决问题是看源码得一点体验,可能说得比较大概,希望大家多多讨 论,把本贴得质量提高上去,因为spring实现的事务管理这部分我相信还是有点复杂的. 一个人未必能想得十分清楚 在spring的声明式事务管理中,它是如何判定一个及标记一个方法是否应该是处在事 务体之中呢. 首先要理解的是spring是如何来标记一个方法是否应该处在事务体之中的.有这样一 个接口TransactionDefinition,其中定义了很多常量,它还有一个子接口 TransactionAttribute,其中

spring声明式事务解析_java

一.spring声明式事务 1.1 spring的事务管理器 spring没有直接管理事务,而是将管理事务的责任委托给JTA或相应的持久性机制所提供的某个特定平台的事务实现.spring容器负责事物的操作,spring容器充当切面,事务的方法称为增强处理,生成的代理对象的方法就是目标方法+增强也就是crud+事务程序员只用做crud的操作,也就是目标方法和声明哪些方法应该在事务中运行. Spring提供了许多内置事务管理器实现: DataSourceTransactionManager:位于or

spring声明式事务 同一类内方法调用事务失效

只要避开Spring目前的AOP实现上的限制,要么都声明要事务,要么分开成两个类,要么直接在方法里使用编程式事务 [问题]        Spring的声明式事务,我想就不用多介绍了吧,一句话"自从用了Spring AOP啊,事务管理真轻松啊,真轻松:事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务:轻量级,测试起来也简单,嘿!".不管从哪个角度看,轻量级声明式事务都是一件解放生产力的大好事.所以,我们"一直用它".         不过,最近的一个项目里

spring声明式事务管理解析_java

前沿:通过对spring事务管理有了比较深入学习,本文将不做实例,而是指定具体的类和配置文件进行讲解. 本文内容: 1.了解什么是声明式事务? 2.声明式事务管理分别有哪几种? 3.这几种事务管理之间的区别是什么? 一.什么是声明式事务? 声明式事务(declarative transaction management)是spring提供的对程序事务管理的方式之一.Spring的声明式事务就是采用声明的方式来处理事务,用在Spring配置文件中声明式的处理事务来代替代码式的处理事务.这样的好处是

spring声明式事务,service层必须在ioc容器中声明?

问题描述 各位,小弟在学习spring+hibernate 声明式事务时,发现一个问题, 做了两种测试1. 建立一个普通的 java projectx.y.services 包下有 applicationContext.xml, DefaultFooService.java, 在applicationContext.xml中对DefaultFooService进行声明式事务,并注入 DefaultFooService运行后成功实现事务管理2. 建立一个 web dynamic project在a

mysql+spring 声明式事务不起作用

问题描述 详细情况如图所示, 真的找不出是哪里存在了问题... 也许是申明式事务配置错误? 求大家帮我看看啦, 谢谢!!! 解决方案 invalid bound statement (not found) 你的那个statement名字估计写的不对解决方案二:首先,不确定到底是哪里出错了,但有几个地方你可以再确定下,1.配置事务的地方增加rollback-for 和 no-rollback-for 属性的值,但是我也不确定这两个属性是否有默认值.<tx:method name="del*&

spring学习笔记(22)声明式事务配置,readOnly无效写无异常

在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置.但在实际开发中,我们可能并不需要这样细粒度的配置.另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务也是一件很繁琐的事情.而且也可能会造成大量重复代码的冗杂堆积.面对这些缺点,我们首要想到的就是我们spring中的AOP了.spring声明式事务的实现恰建立在AOP之上. 在这一篇文章中,我们介绍s