spring声明式事务(初学者实例总结)

时间:2024.3.15

spring声明式事务总结

初学spring,笔记总结:

1:针对某个类的,可以用代理类方式管理事务:

<!-- 下面是进行声明式事务管理的一个方法:代理类 --> <!-- 说明,通过设置代理类来管理事务,要指明目标类是什么,代理目标类设为true (1)代理类管理事务,需要aopalliance.jar和cglib*.jar (2)代理类可以设置在DAO类上,也可以设置在service层的类上,看需求 (3)代理类设置后,就是目标类的子类,调用目标类的bean时,需要调用代理类的bean,具体看本程序理解

如:如果代理类代理DAO类,则messageSvc 的属性messageDao 的ref应该:messageDaoProxy

(4)事务管理中,若发生运行期异常:RuntimeException()则抛异常,且回滚,不写入数据库,若发生普通异常,Exception()则抛异常,不会回滚,依然写入数据库--> <bean id="messageSvcProxy"

</bean> class="org.springframework.transaction.interceptor.TransactionPro <property name="transactionManager" <property name="target"> <ref local="messageSvc" /> </property> <property name="proxyTargetClass" value="true"></property> <property name="transactionAttributes"> <props> <prop key="do*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> xyFactoryBean"> ref="transactionManager"></property> </props> </property>

2. 针对多个类,可使用AOP方式管理事务

<!-- 下面使用声明式事务管理另一方法:AOP的方式,上述方法只能管理一个类,此方法可以批量管理事务

注意:需要加入aspectJ文件夹下的两个jar包 -->

<!-- 配置事务的传播特性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="do*" propagation="REQUIRED" />

<tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <!-- 哪些类的哪些方法参与事务 --> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* com.guo.dao.*.*(..))" /> pointcut-ref="allManagerMethod" /> <aop:advisor advice-ref="txAdvice" </aop:config>

3.声明式事务管理第三种方法:拦截器

<!-- 声明式事务管理的第三种方法:拦截器 -->

<bean id="transactionInterceptor"

class="org.springframework.transaction.interceptor.TransactionInterceptor">

<property name="transactionManager" ref="transactionManager" /> <!-- 配置事务属性 -->

<property name="transactionAttributes">

<props>

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

<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props>

</property>

</bean>

<bean

class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">

<property name="beanNames">

<list>

<value>*Dao</value>

</list>

</property>

<property name="interceptorNames">

<list>

<value>transactionInterceptor</value>

</list>

</property>

</bean>

此外还有:annotation全标签方式,参见另一个word文件,或网址:

http://lvqionghua.blog.163.com/blog/static/185277420xx52234023736/

4.表达式描述

* com.guo.dao.*.*(..):第一个*表示任何返回值,第二个*表示任何类,第三个*表示任何方法:见下描述

除了返回类型模式(上面代码片断中的ret-type-pattern),名字模式和参数模式以外,所有的部分都是可选的。 返回类型模式决定了方法的返回类型必须依次匹配一个连接点。 你会使用的最频繁的返回类型模式是 * ,它代表了匹配任意的返回类型。 一个全称限定的类型名将只会匹配返回给定类型的方法。名字模式匹配的是方法名。 你可以使用 * 通配符作为所有或者部分命名模式。 参数模式稍微有点复杂:() 匹配了一个不接受任何参数的方法, 而 (..) 匹配了一个接受任意数量参数的方法(零或者更多)。 模式 (*) 匹配了一个接受一个任何类型的参数的方法。 模式 (*,String) 匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型。

下面给出一些常见切入点表达式的例子。

任意公共方法的执行:

execution(public * *(..))

任何一个以“set”开始的方法的执行:

execution(* set*(..))

AccountService 接口的任意方法的执行:

execution(* com.xyz.service.AccountService.*(..))

定义在service包里的任意方法的执行:

execution(* com.xyz.service.*.*(..))

定义在service包或者子包里的任意方法的执行:

execution(* com.xyz.service..*.*(..))

5.注意:

运行期异常会发生回滚,普通异常不会回滚,仍可写入数据库


第二篇:Spring声明式事务总结


Spring声明式事务总结

对于Spring声明式事务的管理,配置步骤如下:

1、 首先,把事务管理类包org.springframework.orm. hibernate3.

HibernateTransactionManager配置到Spring配置文件中。配置方式如下:

<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionM

anager">

<property name="sessionFactory">

<ref local="mySessionFactory" />

</property>

</bean>

2、 配置你要进行事务管理拦截的方法点,配置事例如下:

<tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes>

<tx:method name="find*" propagation="REQUIRED" timeout="90" /> <tx:method name="query*" propagation="REQUIRED" timeout="90" /> <tx:method name="put*" propagation="REQUIRED" timeout="90" /> <tx:method name="save*" propagation="REQUIRED" timeout="90" /> <tx:method name="put*" propagation="REQUIRED" timeout="90" /> <tx:method name="delete*" propagation="REQUIRED" timeout="90" />

<tx:method name="get*" propagation="REQUIRED" timeout="90" /> <tx:method name="update*" propagation="REQUIRED" timeout="90" /> <tx:method name="insert*" propagation="REQUIRED" timeout="90" /> <tx:method name="*" propagation="SUPPORTS" timeout="90" />

</tx:attributes>

</tx:advice>

注:*匹配任意字符串;<tx:method/>中可以配置任意你想要进行拦截管理的方法体。

3、 配置你要进行事务管理的拦截面,拦截面可以是一个类,也可以是一个类包下所有类。

配置事例如下:

<aop:config>

<aop:pointcut id="txAdviceService" expression="execution(*

OHDandAHLshow.addARC.*Service.*(..))" />

<aop:advisor advice-ref="txAdvice" pointcut-ref="txAdviceService" /> </aop:config>

<aop:pointcut/>是用来配置要进行事务管理拦截的截面的,expression表达式的内容就要拦截的内容截面,expression表达式的书写方式如下:

execution(modifier-pattern? ret-type-pattern declaring-type-pattern?

name-pattern(param-pattern)

throws -pattern?)

括号中各个 pattern 分别表示修饰符匹配( modifier-pattern? )、返回值匹

配( ret-type-pattern )、类路径匹配( declaring-type-pattern? )、方法名匹配( name-pattern )、参数匹配( (param-pattern) )、异常类型匹配( throws-pattern? ),其中后面跟着“ ? ”的是可选项。

在各个 pattern 中可以使用“ * ”来表示匹配所有。在 (param-pattern) 中,可以指定具体的参数类型,多个参数间用“ , ”隔开,各个也可以用“ * ”来表示匹配任意类型的参数,如 (String) 表示匹配一个 String 参数的方法; (*,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是 String 类型;可以用 (..) 表示零个或多个任意参数。

举例说明:

匹配所有方法

execution(* *(..))

表示匹配 com.savage.server.UserService 中所有的公有方法

execution(public * com. savage.service.UserService.*(..))

任意公共方法的执行:

execution(public * *(..))

任何一个以“set”开始的方法的执行:

execution(* set*(..))

AccountService 接口的任意方法的执行:

execution(* com.xyz.service.AccountService.*(..))

定义在service包里的任意方法的执行:

execution(* com.xyz.service.*.*(..))

定义在service包和所有子包里的任意类的任意方法的执行:

execution(* com.xyz.service..*.*(..))

定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:

execution(* com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")

<aop:advisor/>是用来配置把要进行事务管理的截面与截点联系起来的,截面是类,

截点是方法,意思就是类里的哪些方法需要进行事务管理。

在这里,值得注意的是,要进行事务管理的截面类,如果本身不是接口,且继承了

其他接口,如果把该类配置了事务管理,同时该类在spring容器中注入过,则在程序

运行进行拦截的时候,spring容器在set该类实例的时候,这里产生的实例并非该类

本身,而产生的是该类所实现接口类中没有继承接口类的实例。所以,一般在项目中,

都要写接口,配置事务管理的时候,直接配置拦截接口就行。

JDBC事务管理

JDBC事务管理默认是每完成一条SQL语句就自动提交,故我们在获取数据库连接后,应该将连接改为非自动提交模式:

conn.setAutoCommit(false); //标志着新事务的开始

conn.commit(); //提交

conn.rollback(); //回滚

在JDBC 3.0新增功能中,提供对事务commit和rollback的更好支持,在事务过程中,在两个操作间可以插入一个命名的存储点作为标记,因此可以将事务回滚到那个标记,保留标记有效前的所有操作。

示例:

conn.setAutoCommit(false);

Statement stmt = conn.createStatement();

stmt.executeUpdate(update1);

Savepoint point1 = conn.setSavepoint("point1");

stmt.executeUpdate(update2);

stmt.executeUpdate(update3);

conn.rollback(point1);

conn.commit();


第三篇:声明样本


声明样本

声明:声明是组织(或个人)公开向社会各界申明让更多人知晓的公告性文体,是树立组织形象、扩大知名度的一种手段。

格式:

1.标题。

2.正文:另起行空两格写要申明的内容(可分条写)。

3.最后常用结束语"特此声明"。

4.署名、日期。

范例:

超霸贸易公司郑重声明

凡未经东芝株式会社许可,以任何形式制造、销售或使用与toshiba注册商标相同或相似的商标时,均属侵犯注册商标专用权,对上述侵权行为,日本东芝株式会社将联同中国国际贸易促进会专利商标事务所依法追究侵权的法律责任。

更多相关推荐:
声明样本

声明样本声明声明是组织或个人公开向社会各界申明让更多人知晓的公告性文体是树立组织形象扩大知名度的一种手段格式标题正文另起行空两格写要申明的内容可分条写最后常用结束语quot特此声明quot署名日期范例超霸贸易公...

公司企业声明书范文

附件XXXXXXXX公司企业声明书XXX市商务委员会XX市财政局我公司是XX市一家从事服务外包业务的企业现谨对XX年度申请商务部财政部支持承接国际服务外包业务发展资金工作的有关情况声明如下1我公司严格按照XX年...

免责声明范本

免责声明范本免责声明本人单位姓名单位名称于时间委托委托人或单位申请购买了产品名称由于概述问题本人单位姓名单位名称现申请获得产品名称的管理权为了避免权属纠纷特做如下说明是的真正所有者今后由引起的纠纷和造成的一切后...

声明书范本

Date日期To致ArgentinaTradeandCulturalOffice阿根廷商務文化辦事處ITaHuaWangfatherofHsiaoMinWangmysonintendstovisithisunc...

免责声明范本

免责声明本人单位于委托领取由于原因由现全权代表本人领取相关的费用为了避免纠纷特做如下说明的真正所有者今后由于个人原因引起的纠纷和造成的一切后果其责任概由承担与无关特此声明声明人姓名身份证号联系电话声明人日期

免责声明(范本)

免责声明为规范本次登山活动使每一位决定结伴登山的同学的权利义务责任得到明确请参加者仔细阅读本协议内容此文件为有关责任的豁免权利的放弃风险的承担和赔偿的协议通过阅读此协议参加者对本协议所有条款的含义及相关法律后果...

免责声明 范本

免责声明基于个人办理南方人才市场转正定级手续办理的需要特申请公司提供盖章协助处理盖章仅限该项目手续的办理不做他用若造成其他后果均由本人自行承担与公司无关特此声明声明人日期

各种证明范本

范文一个人收入证明个人收入证明兹有我公司员工性别身份证号码在我司工作年任职部门职位月收入为人民币元特此证明公司加盖公章年月日个人收入证明兹证明是我公司员工性别身份证号码在部门任职务月收入元一年总收入约为元特此证...

工作证明范本

工作证明兹证明是我公司员工在部门任职务特此证明本证明仅用于证明我公司员工的工作不作为我公司对该员工任何形势的担保文件公司名称宿迁分公司盖章日期年月日收入证明兹有我公司员工身份证号码在我司工作年任职部门职位年收入...

工作证明工资证明范本

工作证明兹证明同志现从事工作累计满年特此证明单位名称公章盖章经办人员工工作及收入证明兹证明是我公司员工在部门任职务至今为止一年以来总收入约为元特此证明本证明仅用于证明我公司员工的工作及在我公司的工资收入不作为我...

工作证明范本

工作证明兹证明马永志是我公司员工在保安部门任保安职务特此证明本证明仅用于证明我公司员工的工作不作为我公司对该员工任何形势的担保文件盖章日期20xx年07月25日收入证明兹有我公司员工身份证号码在我司工作年任职部...

单位工作证明标准范本

单位工作证明标准范本兹证明同志现从事工作累计满年特此证明单位名称公章盖章经办人员工工作及收入证明兹证明是我公司员工在部门任职务至今为止一年以来总收入约为元特此证明本证明仅用于证明我公司员工的工作及在我公司的工资...

声明范本(33篇)