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注册商标相同或相似的商标时,均属侵犯注册商标专用权,对上述侵权行为,日本东芝株式会社将联同中国国际贸易促进会专利商标事务所依法追究侵权的法律责任。